You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6: [S390] move include/asm-s390 to arch/s390/include/asm
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
include include/asm-generic/Kbuild.asm
|
||||
|
||||
header-y += dasd.h
|
||||
header-y += monwriter.h
|
||||
header-y += qeth.h
|
||||
header-y += tape390.h
|
||||
header-y += ucontext.h
|
||||
header-y += vtoc.h
|
||||
header-y += zcrypt.h
|
||||
header-y += chsc.h
|
||||
|
||||
unifdef-y += cmb.h
|
||||
unifdef-y += debug.h
|
||||
unifdef-y += chpid.h
|
||||
unifdef-y += schid.h
|
||||
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* include/asm-s390/airq.h
|
||||
*
|
||||
* Copyright IBM Corp. 2002,2007
|
||||
* Author(s): Ingo Adlung <adlung@de.ibm.com>
|
||||
* Cornelia Huck <cornelia.huck@de.ibm.com>
|
||||
* Arnd Bergmann <arndb@de.ibm.com>
|
||||
* Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
|
||||
*/
|
||||
|
||||
#ifndef _ASM_S390_AIRQ_H
|
||||
#define _ASM_S390_AIRQ_H
|
||||
|
||||
typedef void (*adapter_int_handler_t)(void *, void *);
|
||||
|
||||
void *s390_register_adapter_interrupt(adapter_int_handler_t, void *, u8);
|
||||
void s390_unregister_adapter_interrupt(void *, u8);
|
||||
|
||||
#endif /* _ASM_S390_AIRQ_H */
|
||||
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* include/asm-s390/appldata.h
|
||||
*
|
||||
* Copyright (C) IBM Corp. 2006
|
||||
*
|
||||
* Author(s): Melissa Howland <melissah@us.ibm.com>
|
||||
*/
|
||||
|
||||
#ifndef _ASM_S390_APPLDATA_H
|
||||
#define _ASM_S390_APPLDATA_H
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#ifndef CONFIG_64BIT
|
||||
|
||||
#define APPLDATA_START_INTERVAL_REC 0x00 /* Function codes for */
|
||||
#define APPLDATA_STOP_REC 0x01 /* DIAG 0xDC */
|
||||
#define APPLDATA_GEN_EVENT_REC 0x02
|
||||
#define APPLDATA_START_CONFIG_REC 0x03
|
||||
|
||||
/*
|
||||
* Parameter list for DIAGNOSE X'DC'
|
||||
*/
|
||||
struct appldata_parameter_list {
|
||||
u16 diag; /* The DIAGNOSE code X'00DC' */
|
||||
u8 function; /* The function code for the DIAGNOSE */
|
||||
u8 parlist_length; /* Length of the parameter list */
|
||||
u32 product_id_addr; /* Address of the 16-byte product ID */
|
||||
u16 reserved;
|
||||
u16 buffer_length; /* Length of the application data buffer */
|
||||
u32 buffer_addr; /* Address of the application data buffer */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#else /* CONFIG_64BIT */
|
||||
|
||||
#define APPLDATA_START_INTERVAL_REC 0x80
|
||||
#define APPLDATA_STOP_REC 0x81
|
||||
#define APPLDATA_GEN_EVENT_REC 0x82
|
||||
#define APPLDATA_START_CONFIG_REC 0x83
|
||||
|
||||
/*
|
||||
* Parameter list for DIAGNOSE X'DC'
|
||||
*/
|
||||
struct appldata_parameter_list {
|
||||
u16 diag;
|
||||
u8 function;
|
||||
u8 parlist_length;
|
||||
u32 unused01;
|
||||
u16 reserved;
|
||||
u16 buffer_length;
|
||||
u32 unused02;
|
||||
u64 product_id_addr;
|
||||
u64 buffer_addr;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
struct appldata_product_id {
|
||||
char prod_nr[7]; /* product number */
|
||||
u16 prod_fn; /* product function */
|
||||
u8 record_nr; /* record number */
|
||||
u16 version_nr; /* version */
|
||||
u16 release_nr; /* release */
|
||||
u16 mod_lvl; /* modification level */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
static inline int appldata_asm(struct appldata_product_id *id,
|
||||
unsigned short fn, void *buffer,
|
||||
unsigned short length)
|
||||
{
|
||||
struct appldata_parameter_list parm_list;
|
||||
int ry;
|
||||
|
||||
if (!MACHINE_IS_VM)
|
||||
return -ENOSYS;
|
||||
parm_list.diag = 0xdc;
|
||||
parm_list.function = fn;
|
||||
parm_list.parlist_length = sizeof(parm_list);
|
||||
parm_list.buffer_length = length;
|
||||
parm_list.product_id_addr = (unsigned long) id;
|
||||
parm_list.buffer_addr = virt_to_phys(buffer);
|
||||
asm volatile(
|
||||
" diag %1,%0,0xdc"
|
||||
: "=d" (ry)
|
||||
: "d" (&parm_list), "m" (parm_list), "m" (*id)
|
||||
: "cc");
|
||||
return ry;
|
||||
}
|
||||
|
||||
#endif /* _ASM_S390_APPLDATA_H */
|
||||
@@ -0,0 +1,285 @@
|
||||
#ifndef __ARCH_S390_ATOMIC__
|
||||
#define __ARCH_S390_ATOMIC__
|
||||
|
||||
#include <linux/compiler.h>
|
||||
|
||||
/*
|
||||
* include/asm-s390/atomic.h
|
||||
*
|
||||
* S390 version
|
||||
* Copyright (C) 1999-2005 IBM Deutschland Entwicklung GmbH, IBM Corporation
|
||||
* Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
|
||||
* Denis Joseph Barrow,
|
||||
* Arnd Bergmann (arndb@de.ibm.com)
|
||||
*
|
||||
* Derived from "include/asm-i386/bitops.h"
|
||||
* Copyright (C) 1992, Linus Torvalds
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Atomic operations that C can't guarantee us. Useful for
|
||||
* resource counting etc..
|
||||
* S390 uses 'Compare And Swap' for atomicity in SMP enviroment
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
int counter;
|
||||
} __attribute__ ((aligned (4))) atomic_t;
|
||||
#define ATOMIC_INIT(i) { (i) }
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
|
||||
|
||||
#define __CS_LOOP(ptr, op_val, op_string) ({ \
|
||||
typeof(ptr->counter) old_val, new_val; \
|
||||
asm volatile( \
|
||||
" l %0,%2\n" \
|
||||
"0: lr %1,%0\n" \
|
||||
op_string " %1,%3\n" \
|
||||
" cs %0,%1,%2\n" \
|
||||
" jl 0b" \
|
||||
: "=&d" (old_val), "=&d" (new_val), \
|
||||
"=Q" (((atomic_t *)(ptr))->counter) \
|
||||
: "d" (op_val), "Q" (((atomic_t *)(ptr))->counter) \
|
||||
: "cc", "memory"); \
|
||||
new_val; \
|
||||
})
|
||||
|
||||
#else /* __GNUC__ */
|
||||
|
||||
#define __CS_LOOP(ptr, op_val, op_string) ({ \
|
||||
typeof(ptr->counter) old_val, new_val; \
|
||||
asm volatile( \
|
||||
" l %0,0(%3)\n" \
|
||||
"0: lr %1,%0\n" \
|
||||
op_string " %1,%4\n" \
|
||||
" cs %0,%1,0(%3)\n" \
|
||||
" jl 0b" \
|
||||
: "=&d" (old_val), "=&d" (new_val), \
|
||||
"=m" (((atomic_t *)(ptr))->counter) \
|
||||
: "a" (ptr), "d" (op_val), \
|
||||
"m" (((atomic_t *)(ptr))->counter) \
|
||||
: "cc", "memory"); \
|
||||
new_val; \
|
||||
})
|
||||
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
static inline int atomic_read(const atomic_t *v)
|
||||
{
|
||||
barrier();
|
||||
return v->counter;
|
||||
}
|
||||
|
||||
static inline void atomic_set(atomic_t *v, int i)
|
||||
{
|
||||
v->counter = i;
|
||||
barrier();
|
||||
}
|
||||
|
||||
static __inline__ int atomic_add_return(int i, atomic_t * v)
|
||||
{
|
||||
return __CS_LOOP(v, i, "ar");
|
||||
}
|
||||
#define atomic_add(_i, _v) atomic_add_return(_i, _v)
|
||||
#define atomic_add_negative(_i, _v) (atomic_add_return(_i, _v) < 0)
|
||||
#define atomic_inc(_v) atomic_add_return(1, _v)
|
||||
#define atomic_inc_return(_v) atomic_add_return(1, _v)
|
||||
#define atomic_inc_and_test(_v) (atomic_add_return(1, _v) == 0)
|
||||
|
||||
static __inline__ int atomic_sub_return(int i, atomic_t * v)
|
||||
{
|
||||
return __CS_LOOP(v, i, "sr");
|
||||
}
|
||||
#define atomic_sub(_i, _v) atomic_sub_return(_i, _v)
|
||||
#define atomic_sub_and_test(_i, _v) (atomic_sub_return(_i, _v) == 0)
|
||||
#define atomic_dec(_v) atomic_sub_return(1, _v)
|
||||
#define atomic_dec_return(_v) atomic_sub_return(1, _v)
|
||||
#define atomic_dec_and_test(_v) (atomic_sub_return(1, _v) == 0)
|
||||
|
||||
static __inline__ void atomic_clear_mask(unsigned long mask, atomic_t * v)
|
||||
{
|
||||
__CS_LOOP(v, ~mask, "nr");
|
||||
}
|
||||
|
||||
static __inline__ void atomic_set_mask(unsigned long mask, atomic_t * v)
|
||||
{
|
||||
__CS_LOOP(v, mask, "or");
|
||||
}
|
||||
|
||||
#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
|
||||
|
||||
static __inline__ int atomic_cmpxchg(atomic_t *v, int old, int new)
|
||||
{
|
||||
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
|
||||
asm volatile(
|
||||
" cs %0,%2,%1"
|
||||
: "+d" (old), "=Q" (v->counter)
|
||||
: "d" (new), "Q" (v->counter)
|
||||
: "cc", "memory");
|
||||
#else /* __GNUC__ */
|
||||
asm volatile(
|
||||
" cs %0,%3,0(%2)"
|
||||
: "+d" (old), "=m" (v->counter)
|
||||
: "a" (v), "d" (new), "m" (v->counter)
|
||||
: "cc", "memory");
|
||||
#endif /* __GNUC__ */
|
||||
return old;
|
||||
}
|
||||
|
||||
static __inline__ int atomic_add_unless(atomic_t *v, int a, int u)
|
||||
{
|
||||
int c, old;
|
||||
c = atomic_read(v);
|
||||
for (;;) {
|
||||
if (unlikely(c == u))
|
||||
break;
|
||||
old = atomic_cmpxchg(v, c, c + a);
|
||||
if (likely(old == c))
|
||||
break;
|
||||
c = old;
|
||||
}
|
||||
return c != u;
|
||||
}
|
||||
|
||||
#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
|
||||
|
||||
#undef __CS_LOOP
|
||||
|
||||
#ifdef __s390x__
|
||||
typedef struct {
|
||||
long long counter;
|
||||
} __attribute__ ((aligned (8))) atomic64_t;
|
||||
#define ATOMIC64_INIT(i) { (i) }
|
||||
|
||||
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
|
||||
|
||||
#define __CSG_LOOP(ptr, op_val, op_string) ({ \
|
||||
typeof(ptr->counter) old_val, new_val; \
|
||||
asm volatile( \
|
||||
" lg %0,%2\n" \
|
||||
"0: lgr %1,%0\n" \
|
||||
op_string " %1,%3\n" \
|
||||
" csg %0,%1,%2\n" \
|
||||
" jl 0b" \
|
||||
: "=&d" (old_val), "=&d" (new_val), \
|
||||
"=Q" (((atomic_t *)(ptr))->counter) \
|
||||
: "d" (op_val), "Q" (((atomic_t *)(ptr))->counter) \
|
||||
: "cc", "memory" ); \
|
||||
new_val; \
|
||||
})
|
||||
|
||||
#else /* __GNUC__ */
|
||||
|
||||
#define __CSG_LOOP(ptr, op_val, op_string) ({ \
|
||||
typeof(ptr->counter) old_val, new_val; \
|
||||
asm volatile( \
|
||||
" lg %0,0(%3)\n" \
|
||||
"0: lgr %1,%0\n" \
|
||||
op_string " %1,%4\n" \
|
||||
" csg %0,%1,0(%3)\n" \
|
||||
" jl 0b" \
|
||||
: "=&d" (old_val), "=&d" (new_val), \
|
||||
"=m" (((atomic_t *)(ptr))->counter) \
|
||||
: "a" (ptr), "d" (op_val), \
|
||||
"m" (((atomic_t *)(ptr))->counter) \
|
||||
: "cc", "memory" ); \
|
||||
new_val; \
|
||||
})
|
||||
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
static inline long long atomic64_read(const atomic64_t *v)
|
||||
{
|
||||
barrier();
|
||||
return v->counter;
|
||||
}
|
||||
|
||||
static inline void atomic64_set(atomic64_t *v, long long i)
|
||||
{
|
||||
v->counter = i;
|
||||
barrier();
|
||||
}
|
||||
|
||||
static __inline__ long long atomic64_add_return(long long i, atomic64_t * v)
|
||||
{
|
||||
return __CSG_LOOP(v, i, "agr");
|
||||
}
|
||||
#define atomic64_add(_i, _v) atomic64_add_return(_i, _v)
|
||||
#define atomic64_add_negative(_i, _v) (atomic64_add_return(_i, _v) < 0)
|
||||
#define atomic64_inc(_v) atomic64_add_return(1, _v)
|
||||
#define atomic64_inc_return(_v) atomic64_add_return(1, _v)
|
||||
#define atomic64_inc_and_test(_v) (atomic64_add_return(1, _v) == 0)
|
||||
|
||||
static __inline__ long long atomic64_sub_return(long long i, atomic64_t * v)
|
||||
{
|
||||
return __CSG_LOOP(v, i, "sgr");
|
||||
}
|
||||
#define atomic64_sub(_i, _v) atomic64_sub_return(_i, _v)
|
||||
#define atomic64_sub_and_test(_i, _v) (atomic64_sub_return(_i, _v) == 0)
|
||||
#define atomic64_dec(_v) atomic64_sub_return(1, _v)
|
||||
#define atomic64_dec_return(_v) atomic64_sub_return(1, _v)
|
||||
#define atomic64_dec_and_test(_v) (atomic64_sub_return(1, _v) == 0)
|
||||
|
||||
static __inline__ void atomic64_clear_mask(unsigned long mask, atomic64_t * v)
|
||||
{
|
||||
__CSG_LOOP(v, ~mask, "ngr");
|
||||
}
|
||||
|
||||
static __inline__ void atomic64_set_mask(unsigned long mask, atomic64_t * v)
|
||||
{
|
||||
__CSG_LOOP(v, mask, "ogr");
|
||||
}
|
||||
|
||||
#define atomic64_xchg(v, new) (xchg(&((v)->counter), new))
|
||||
|
||||
static __inline__ long long atomic64_cmpxchg(atomic64_t *v,
|
||||
long long old, long long new)
|
||||
{
|
||||
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
|
||||
asm volatile(
|
||||
" csg %0,%2,%1"
|
||||
: "+d" (old), "=Q" (v->counter)
|
||||
: "d" (new), "Q" (v->counter)
|
||||
: "cc", "memory");
|
||||
#else /* __GNUC__ */
|
||||
asm volatile(
|
||||
" csg %0,%3,0(%2)"
|
||||
: "+d" (old), "=m" (v->counter)
|
||||
: "a" (v), "d" (new), "m" (v->counter)
|
||||
: "cc", "memory");
|
||||
#endif /* __GNUC__ */
|
||||
return old;
|
||||
}
|
||||
|
||||
static __inline__ int atomic64_add_unless(atomic64_t *v,
|
||||
long long a, long long u)
|
||||
{
|
||||
long long c, old;
|
||||
c = atomic64_read(v);
|
||||
for (;;) {
|
||||
if (unlikely(c == u))
|
||||
break;
|
||||
old = atomic64_cmpxchg(v, c, c + a);
|
||||
if (likely(old == c))
|
||||
break;
|
||||
c = old;
|
||||
}
|
||||
return c != u;
|
||||
}
|
||||
|
||||
#define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
|
||||
|
||||
#undef __CSG_LOOP
|
||||
#endif
|
||||
|
||||
#define smp_mb__before_atomic_dec() smp_mb()
|
||||
#define smp_mb__after_atomic_dec() smp_mb()
|
||||
#define smp_mb__before_atomic_inc() smp_mb()
|
||||
#define smp_mb__after_atomic_inc() smp_mb()
|
||||
|
||||
#include <asm-generic/atomic.h>
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* __ARCH_S390_ATOMIC__ */
|
||||
@@ -0,0 +1,4 @@
|
||||
#ifndef __ASMS390_AUXVEC_H
|
||||
#define __ASMS390_AUXVEC_H
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,70 @@
|
||||
#ifndef _ASM_S390_BUG_H
|
||||
#define _ASM_S390_BUG_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#ifdef CONFIG_BUG
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#define S390_LONG ".quad"
|
||||
#else
|
||||
#define S390_LONG ".long"
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DEBUG_BUGVERBOSE
|
||||
|
||||
#define __EMIT_BUG(x) do { \
|
||||
asm volatile( \
|
||||
"0: j 0b+2\n" \
|
||||
"1:\n" \
|
||||
".section .rodata.str,\"aMS\",@progbits,1\n" \
|
||||
"2: .asciz \""__FILE__"\"\n" \
|
||||
".previous\n" \
|
||||
".section __bug_table,\"a\"\n" \
|
||||
"3:\t" S390_LONG "\t1b,2b\n" \
|
||||
" .short %0,%1\n" \
|
||||
" .org 3b+%2\n" \
|
||||
".previous\n" \
|
||||
: : "i" (__LINE__), \
|
||||
"i" (x), \
|
||||
"i" (sizeof(struct bug_entry))); \
|
||||
} while (0)
|
||||
|
||||
#else /* CONFIG_DEBUG_BUGVERBOSE */
|
||||
|
||||
#define __EMIT_BUG(x) do { \
|
||||
asm volatile( \
|
||||
"0: j 0b+2\n" \
|
||||
"1:\n" \
|
||||
".section __bug_table,\"a\"\n" \
|
||||
"2:\t" S390_LONG "\t1b\n" \
|
||||
" .short %0\n" \
|
||||
" .org 2b+%1\n" \
|
||||
".previous\n" \
|
||||
: : "i" (x), \
|
||||
"i" (sizeof(struct bug_entry))); \
|
||||
} while (0)
|
||||
|
||||
#endif /* CONFIG_DEBUG_BUGVERBOSE */
|
||||
|
||||
#define BUG() __EMIT_BUG(0)
|
||||
|
||||
#define WARN_ON(x) ({ \
|
||||
int __ret_warn_on = !!(x); \
|
||||
if (__builtin_constant_p(__ret_warn_on)) { \
|
||||
if (__ret_warn_on) \
|
||||
__EMIT_BUG(BUGFLAG_WARNING); \
|
||||
} else { \
|
||||
if (unlikely(__ret_warn_on)) \
|
||||
__EMIT_BUG(BUGFLAG_WARNING); \
|
||||
} \
|
||||
unlikely(__ret_warn_on); \
|
||||
})
|
||||
|
||||
#define HAVE_ARCH_BUG
|
||||
#define HAVE_ARCH_WARN_ON
|
||||
#endif /* CONFIG_BUG */
|
||||
|
||||
#include <asm-generic/bug.h>
|
||||
|
||||
#endif /* _ASM_S390_BUG_H */
|
||||
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* include/asm-s390/bugs.h
|
||||
*
|
||||
* S390 version
|
||||
* Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
|
||||
* Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
|
||||
*
|
||||
* Derived from "include/asm-i386/bugs.h"
|
||||
* Copyright (C) 1994 Linus Torvalds
|
||||
*/
|
||||
|
||||
/*
|
||||
* This is included by init/main.c to check for architecture-dependent bugs.
|
||||
*
|
||||
* Needs:
|
||||
* void check_bugs(void);
|
||||
*/
|
||||
|
||||
static inline void check_bugs(void)
|
||||
{
|
||||
/* s390 has no bugs ... */
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
#ifndef _S390_BYTEORDER_H
|
||||
#define _S390_BYTEORDER_H
|
||||
|
||||
/*
|
||||
* include/asm-s390/byteorder.h
|
||||
*
|
||||
* S390 version
|
||||
* Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
|
||||
* Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
|
||||
*/
|
||||
|
||||
#include <asm/types.h>
|
||||
|
||||
#ifdef __GNUC__
|
||||
|
||||
#ifdef __s390x__
|
||||
static inline __u64 ___arch__swab64p(const __u64 *x)
|
||||
{
|
||||
__u64 result;
|
||||
|
||||
asm volatile("lrvg %0,%1" : "=d" (result) : "m" (*x));
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline __u64 ___arch__swab64(__u64 x)
|
||||
{
|
||||
__u64 result;
|
||||
|
||||
asm volatile("lrvgr %0,%1" : "=d" (result) : "d" (x));
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline void ___arch__swab64s(__u64 *x)
|
||||
{
|
||||
*x = ___arch__swab64p(x);
|
||||
}
|
||||
#endif /* __s390x__ */
|
||||
|
||||
static inline __u32 ___arch__swab32p(const __u32 *x)
|
||||
{
|
||||
__u32 result;
|
||||
|
||||
asm volatile(
|
||||
#ifndef __s390x__
|
||||
" icm %0,8,3(%1)\n"
|
||||
" icm %0,4,2(%1)\n"
|
||||
" icm %0,2,1(%1)\n"
|
||||
" ic %0,0(%1)"
|
||||
: "=&d" (result) : "a" (x), "m" (*x) : "cc");
|
||||
#else /* __s390x__ */
|
||||
" lrv %0,%1"
|
||||
: "=d" (result) : "m" (*x));
|
||||
#endif /* __s390x__ */
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline __u32 ___arch__swab32(__u32 x)
|
||||
{
|
||||
#ifndef __s390x__
|
||||
return ___arch__swab32p(&x);
|
||||
#else /* __s390x__ */
|
||||
__u32 result;
|
||||
|
||||
asm volatile("lrvr %0,%1" : "=d" (result) : "d" (x));
|
||||
return result;
|
||||
#endif /* __s390x__ */
|
||||
}
|
||||
|
||||
static __inline__ void ___arch__swab32s(__u32 *x)
|
||||
{
|
||||
*x = ___arch__swab32p(x);
|
||||
}
|
||||
|
||||
static __inline__ __u16 ___arch__swab16p(const __u16 *x)
|
||||
{
|
||||
__u16 result;
|
||||
|
||||
asm volatile(
|
||||
#ifndef __s390x__
|
||||
" icm %0,2,1(%1)\n"
|
||||
" ic %0,0(%1)\n"
|
||||
: "=&d" (result) : "a" (x), "m" (*x) : "cc");
|
||||
#else /* __s390x__ */
|
||||
" lrvh %0,%1"
|
||||
: "=d" (result) : "m" (*x));
|
||||
#endif /* __s390x__ */
|
||||
return result;
|
||||
}
|
||||
|
||||
static __inline__ __u16 ___arch__swab16(__u16 x)
|
||||
{
|
||||
return ___arch__swab16p(&x);
|
||||
}
|
||||
|
||||
static __inline__ void ___arch__swab16s(__u16 *x)
|
||||
{
|
||||
*x = ___arch__swab16p(x);
|
||||
}
|
||||
|
||||
#ifdef __s390x__
|
||||
#define __arch__swab64(x) ___arch__swab64(x)
|
||||
#define __arch__swab64p(x) ___arch__swab64p(x)
|
||||
#define __arch__swab64s(x) ___arch__swab64s(x)
|
||||
#endif /* __s390x__ */
|
||||
#define __arch__swab32(x) ___arch__swab32(x)
|
||||
#define __arch__swab16(x) ___arch__swab16(x)
|
||||
#define __arch__swab32p(x) ___arch__swab32p(x)
|
||||
#define __arch__swab16p(x) ___arch__swab16p(x)
|
||||
#define __arch__swab32s(x) ___arch__swab32s(x)
|
||||
#define __arch__swab16s(x) ___arch__swab16s(x)
|
||||
|
||||
#ifndef __s390x__
|
||||
#if !defined(__STRICT_ANSI__) || defined(__KERNEL__)
|
||||
# define __BYTEORDER_HAS_U64__
|
||||
# define __SWAB_64_THRU_32__
|
||||
#endif
|
||||
#else /* __s390x__ */
|
||||
#define __BYTEORDER_HAS_U64__
|
||||
#endif /* __s390x__ */
|
||||
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
#include <linux/byteorder/big_endian.h>
|
||||
|
||||
#endif /* _S390_BYTEORDER_H */
|
||||
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* include/asm-s390/cache.h
|
||||
*
|
||||
* S390 version
|
||||
* Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
|
||||
*
|
||||
* Derived from "include/asm-i386/cache.h"
|
||||
* Copyright (C) 1992, Linus Torvalds
|
||||
*/
|
||||
|
||||
#ifndef __ARCH_S390_CACHE_H
|
||||
#define __ARCH_S390_CACHE_H
|
||||
|
||||
#define L1_CACHE_BYTES 256
|
||||
#define L1_CACHE_SHIFT 8
|
||||
|
||||
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,31 @@
|
||||
#ifndef _S390_CACHEFLUSH_H
|
||||
#define _S390_CACHEFLUSH_H
|
||||
|
||||
/* Keep includes the same across arches. */
|
||||
#include <linux/mm.h>
|
||||
|
||||
/* Caches aren't brain-dead on the s390. */
|
||||
#define flush_cache_all() do { } while (0)
|
||||
#define flush_cache_mm(mm) do { } while (0)
|
||||
#define flush_cache_dup_mm(mm) do { } while (0)
|
||||
#define flush_cache_range(vma, start, end) do { } while (0)
|
||||
#define flush_cache_page(vma, vmaddr, pfn) do { } while (0)
|
||||
#define flush_dcache_page(page) do { } while (0)
|
||||
#define flush_dcache_mmap_lock(mapping) do { } while (0)
|
||||
#define flush_dcache_mmap_unlock(mapping) do { } while (0)
|
||||
#define flush_icache_range(start, end) do { } while (0)
|
||||
#define flush_icache_page(vma,pg) do { } while (0)
|
||||
#define flush_icache_user_range(vma,pg,adr,len) do { } while (0)
|
||||
#define flush_cache_vmap(start, end) do { } while (0)
|
||||
#define flush_cache_vunmap(start, end) do { } while (0)
|
||||
|
||||
#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
|
||||
memcpy(dst, src, len)
|
||||
#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
|
||||
memcpy(dst, src, len)
|
||||
|
||||
#ifdef CONFIG_DEBUG_PAGEALLOC
|
||||
void kernel_map_pages(struct page *page, int numpages, int enable);
|
||||
#endif
|
||||
|
||||
#endif /* _S390_CACHEFLUSH_H */
|
||||
@@ -0,0 +1,192 @@
|
||||
/*
|
||||
* include/asm-s390/ccwdev.h
|
||||
* include/asm-s390x/ccwdev.h
|
||||
*
|
||||
* Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
|
||||
* Author(s): Arnd Bergmann <arndb@de.ibm.com>
|
||||
*
|
||||
* Interface for CCW device drivers
|
||||
*/
|
||||
#ifndef _S390_CCWDEV_H_
|
||||
#define _S390_CCWDEV_H_
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <asm/fcx.h>
|
||||
|
||||
/* structs from asm/cio.h */
|
||||
struct irb;
|
||||
struct ccw1;
|
||||
struct ccw_dev_id;
|
||||
|
||||
/* simplified initializers for struct ccw_device:
|
||||
* CCW_DEVICE and CCW_DEVICE_DEVTYPE initialize one
|
||||
* entry in your MODULE_DEVICE_TABLE and set the match_flag correctly */
|
||||
#define CCW_DEVICE(cu, cum) \
|
||||
.cu_type=(cu), .cu_model=(cum), \
|
||||
.match_flags=(CCW_DEVICE_ID_MATCH_CU_TYPE \
|
||||
| (cum ? CCW_DEVICE_ID_MATCH_CU_MODEL : 0))
|
||||
|
||||
#define CCW_DEVICE_DEVTYPE(cu, cum, dev, devm) \
|
||||
.cu_type=(cu), .cu_model=(cum), .dev_type=(dev), .dev_model=(devm),\
|
||||
.match_flags=CCW_DEVICE_ID_MATCH_CU_TYPE \
|
||||
| ((cum) ? CCW_DEVICE_ID_MATCH_CU_MODEL : 0) \
|
||||
| CCW_DEVICE_ID_MATCH_DEVICE_TYPE \
|
||||
| ((devm) ? CCW_DEVICE_ID_MATCH_DEVICE_MODEL : 0)
|
||||
|
||||
/* scan through an array of device ids and return the first
|
||||
* entry that matches the device.
|
||||
*
|
||||
* the array must end with an entry containing zero match_flags
|
||||
*/
|
||||
static inline const struct ccw_device_id *
|
||||
ccw_device_id_match(const struct ccw_device_id *array,
|
||||
const struct ccw_device_id *match)
|
||||
{
|
||||
const struct ccw_device_id *id = array;
|
||||
|
||||
for (id = array; id->match_flags; id++) {
|
||||
if ((id->match_flags & CCW_DEVICE_ID_MATCH_CU_TYPE)
|
||||
&& (id->cu_type != match->cu_type))
|
||||
continue;
|
||||
|
||||
if ((id->match_flags & CCW_DEVICE_ID_MATCH_CU_MODEL)
|
||||
&& (id->cu_model != match->cu_model))
|
||||
continue;
|
||||
|
||||
if ((id->match_flags & CCW_DEVICE_ID_MATCH_DEVICE_TYPE)
|
||||
&& (id->dev_type != match->dev_type))
|
||||
continue;
|
||||
|
||||
if ((id->match_flags & CCW_DEVICE_ID_MATCH_DEVICE_MODEL)
|
||||
&& (id->dev_model != match->dev_model))
|
||||
continue;
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* struct ccw_device - channel attached device
|
||||
* @ccwlock: pointer to device lock
|
||||
* @id: id of this device
|
||||
* @drv: ccw driver for this device
|
||||
* @dev: embedded device structure
|
||||
* @online: online status of device
|
||||
* @handler: interrupt handler
|
||||
*
|
||||
* @handler is a member of the device rather than the driver since a driver
|
||||
* can have different interrupt handlers for different ccw devices
|
||||
* (multi-subchannel drivers).
|
||||
*/
|
||||
struct ccw_device {
|
||||
spinlock_t *ccwlock;
|
||||
/* private: */
|
||||
struct ccw_device_private *private; /* cio private information */
|
||||
/* public: */
|
||||
struct ccw_device_id id;
|
||||
struct ccw_driver *drv;
|
||||
struct device dev;
|
||||
int online;
|
||||
void (*handler) (struct ccw_device *, unsigned long, struct irb *);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* struct ccw driver - device driver for channel attached devices
|
||||
* @owner: owning module
|
||||
* @ids: ids supported by this driver
|
||||
* @probe: function called on probe
|
||||
* @remove: function called on remove
|
||||
* @set_online: called when setting device online
|
||||
* @set_offline: called when setting device offline
|
||||
* @notify: notify driver of device state changes
|
||||
* @shutdown: called at device shutdown
|
||||
* @driver: embedded device driver structure
|
||||
* @name: device driver name
|
||||
*/
|
||||
struct ccw_driver {
|
||||
struct module *owner;
|
||||
struct ccw_device_id *ids;
|
||||
int (*probe) (struct ccw_device *);
|
||||
void (*remove) (struct ccw_device *);
|
||||
int (*set_online) (struct ccw_device *);
|
||||
int (*set_offline) (struct ccw_device *);
|
||||
int (*notify) (struct ccw_device *, int);
|
||||
void (*shutdown) (struct ccw_device *);
|
||||
struct device_driver driver;
|
||||
char *name;
|
||||
};
|
||||
|
||||
extern struct ccw_device *get_ccwdev_by_busid(struct ccw_driver *cdrv,
|
||||
const char *bus_id);
|
||||
|
||||
/* devices drivers call these during module load and unload.
|
||||
* When a driver is registered, its probe method is called
|
||||
* when new devices for its type pop up */
|
||||
extern int ccw_driver_register (struct ccw_driver *driver);
|
||||
extern void ccw_driver_unregister (struct ccw_driver *driver);
|
||||
|
||||
struct ccw1;
|
||||
|
||||
extern int ccw_device_set_options_mask(struct ccw_device *, unsigned long);
|
||||
extern int ccw_device_set_options(struct ccw_device *, unsigned long);
|
||||
extern void ccw_device_clear_options(struct ccw_device *, unsigned long);
|
||||
|
||||
/* Allow for i/o completion notification after primary interrupt status. */
|
||||
#define CCWDEV_EARLY_NOTIFICATION 0x0001
|
||||
/* Report all interrupt conditions. */
|
||||
#define CCWDEV_REPORT_ALL 0x0002
|
||||
/* Try to perform path grouping. */
|
||||
#define CCWDEV_DO_PATHGROUP 0x0004
|
||||
/* Allow forced onlining of boxed devices. */
|
||||
#define CCWDEV_ALLOW_FORCE 0x0008
|
||||
|
||||
extern int ccw_device_start(struct ccw_device *, struct ccw1 *,
|
||||
unsigned long, __u8, unsigned long);
|
||||
extern int ccw_device_start_timeout(struct ccw_device *, struct ccw1 *,
|
||||
unsigned long, __u8, unsigned long, int);
|
||||
extern int ccw_device_start_key(struct ccw_device *, struct ccw1 *,
|
||||
unsigned long, __u8, __u8, unsigned long);
|
||||
extern int ccw_device_start_timeout_key(struct ccw_device *, struct ccw1 *,
|
||||
unsigned long, __u8, __u8,
|
||||
unsigned long, int);
|
||||
|
||||
|
||||
extern int ccw_device_resume(struct ccw_device *);
|
||||
extern int ccw_device_halt(struct ccw_device *, unsigned long);
|
||||
extern int ccw_device_clear(struct ccw_device *, unsigned long);
|
||||
int ccw_device_tm_start_key(struct ccw_device *cdev, struct tcw *tcw,
|
||||
unsigned long intparm, u8 lpm, u8 key);
|
||||
int ccw_device_tm_start_key(struct ccw_device *, struct tcw *,
|
||||
unsigned long, u8, u8);
|
||||
int ccw_device_tm_start_timeout_key(struct ccw_device *, struct tcw *,
|
||||
unsigned long, u8, u8, int);
|
||||
int ccw_device_tm_start(struct ccw_device *, struct tcw *,
|
||||
unsigned long, u8);
|
||||
int ccw_device_tm_start_timeout(struct ccw_device *, struct tcw *,
|
||||
unsigned long, u8, int);
|
||||
int ccw_device_tm_intrg(struct ccw_device *cdev);
|
||||
|
||||
extern int ccw_device_set_online(struct ccw_device *cdev);
|
||||
extern int ccw_device_set_offline(struct ccw_device *cdev);
|
||||
|
||||
|
||||
extern struct ciw *ccw_device_get_ciw(struct ccw_device *, __u32 cmd);
|
||||
extern __u8 ccw_device_get_path_mask(struct ccw_device *);
|
||||
extern void ccw_device_get_id(struct ccw_device *, struct ccw_dev_id *);
|
||||
|
||||
#define get_ccwdev_lock(x) (x)->ccwlock
|
||||
|
||||
#define to_ccwdev(n) container_of(n, struct ccw_device, dev)
|
||||
#define to_ccwdrv(n) container_of(n, struct ccw_driver, driver)
|
||||
|
||||
extern struct ccw_device *ccw_device_probe_console(void);
|
||||
|
||||
// FIXME: these have to go
|
||||
extern int _ccw_device_get_subchannel_number(struct ccw_device *);
|
||||
|
||||
extern void *ccw_device_get_chp_desc(struct ccw_device *, int);
|
||||
#endif /* _S390_CCWDEV_H_ */
|
||||
@@ -0,0 +1,69 @@
|
||||
#ifndef S390_CCWGROUP_H
|
||||
#define S390_CCWGROUP_H
|
||||
|
||||
struct ccw_device;
|
||||
struct ccw_driver;
|
||||
|
||||
/**
|
||||
* struct ccwgroup_device - ccw group device
|
||||
* @creator_id: unique number of the driver
|
||||
* @state: online/offline state
|
||||
* @count: number of attached slave devices
|
||||
* @dev: embedded device structure
|
||||
* @cdev: variable number of slave devices, allocated as needed
|
||||
*/
|
||||
struct ccwgroup_device {
|
||||
unsigned long creator_id;
|
||||
enum {
|
||||
CCWGROUP_OFFLINE,
|
||||
CCWGROUP_ONLINE,
|
||||
} state;
|
||||
/* private: */
|
||||
atomic_t onoff;
|
||||
struct mutex reg_mutex;
|
||||
/* public: */
|
||||
unsigned int count;
|
||||
struct device dev;
|
||||
struct ccw_device *cdev[0];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ccwgroup_driver - driver for ccw group devices
|
||||
* @owner: driver owner
|
||||
* @name: driver name
|
||||
* @max_slaves: maximum number of slave devices
|
||||
* @driver_id: unique id
|
||||
* @probe: function called on probe
|
||||
* @remove: function called on remove
|
||||
* @set_online: function called when device is set online
|
||||
* @set_offline: function called when device is set offline
|
||||
* @shutdown: function called when device is shut down
|
||||
* @driver: embedded driver structure
|
||||
*/
|
||||
struct ccwgroup_driver {
|
||||
struct module *owner;
|
||||
char *name;
|
||||
int max_slaves;
|
||||
unsigned long driver_id;
|
||||
|
||||
int (*probe) (struct ccwgroup_device *);
|
||||
void (*remove) (struct ccwgroup_device *);
|
||||
int (*set_online) (struct ccwgroup_device *);
|
||||
int (*set_offline) (struct ccwgroup_device *);
|
||||
void (*shutdown)(struct ccwgroup_device *);
|
||||
|
||||
struct device_driver driver;
|
||||
};
|
||||
|
||||
extern int ccwgroup_driver_register (struct ccwgroup_driver *cdriver);
|
||||
extern void ccwgroup_driver_unregister (struct ccwgroup_driver *cdriver);
|
||||
int ccwgroup_create_from_string(struct device *root, unsigned int creator_id,
|
||||
struct ccw_driver *cdrv, int num_devices,
|
||||
const char *buf);
|
||||
|
||||
extern int ccwgroup_probe_ccwdev(struct ccw_device *cdev);
|
||||
extern void ccwgroup_remove_ccwdev(struct ccw_device *cdev);
|
||||
|
||||
#define to_ccwgroupdev(x) container_of((x), struct ccwgroup_device, dev)
|
||||
#define to_ccwgroupdrv(x) container_of((x), struct ccwgroup_driver, driver)
|
||||
#endif
|
||||
@@ -0,0 +1,166 @@
|
||||
#ifndef _S390_CHECKSUM_H
|
||||
#define _S390_CHECKSUM_H
|
||||
|
||||
/*
|
||||
* include/asm-s390/checksum.h
|
||||
* S390 fast network checksum routines
|
||||
* see also arch/S390/lib/checksum.c
|
||||
*
|
||||
* S390 version
|
||||
* Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
|
||||
* Author(s): Ulrich Hild (first version)
|
||||
* Martin Schwidefsky (heavily optimized CKSM version)
|
||||
* D.J. Barrow (third attempt)
|
||||
*/
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
/*
|
||||
* computes the checksum of a memory block at buff, length len,
|
||||
* and adds in "sum" (32-bit)
|
||||
*
|
||||
* returns a 32-bit number suitable for feeding into itself
|
||||
* or csum_tcpudp_magic
|
||||
*
|
||||
* this function must be called with even lengths, except
|
||||
* for the last fragment, which may be odd
|
||||
*
|
||||
* it's best to have buff aligned on a 32-bit boundary
|
||||
*/
|
||||
static inline __wsum
|
||||
csum_partial(const void *buff, int len, __wsum sum)
|
||||
{
|
||||
register unsigned long reg2 asm("2") = (unsigned long) buff;
|
||||
register unsigned long reg3 asm("3") = (unsigned long) len;
|
||||
|
||||
asm volatile(
|
||||
"0: cksm %0,%1\n" /* do checksum on longs */
|
||||
" jo 0b\n"
|
||||
: "+d" (sum), "+d" (reg2), "+d" (reg3) : : "cc", "memory");
|
||||
return sum;
|
||||
}
|
||||
|
||||
/*
|
||||
* the same as csum_partial_copy, but copies from user space.
|
||||
*
|
||||
* here even more important to align src and dst on a 32-bit (or even
|
||||
* better 64-bit) boundary
|
||||
*
|
||||
* Copy from userspace and compute checksum. If we catch an exception
|
||||
* then zero the rest of the buffer.
|
||||
*/
|
||||
static inline __wsum
|
||||
csum_partial_copy_from_user(const void __user *src, void *dst,
|
||||
int len, __wsum sum,
|
||||
int *err_ptr)
|
||||
{
|
||||
int missing;
|
||||
|
||||
missing = copy_from_user(dst, src, len);
|
||||
if (missing) {
|
||||
memset(dst + len - missing, 0, missing);
|
||||
*err_ptr = -EFAULT;
|
||||
}
|
||||
|
||||
return csum_partial(dst, len, sum);
|
||||
}
|
||||
|
||||
|
||||
static inline __wsum
|
||||
csum_partial_copy_nocheck (const void *src, void *dst, int len, __wsum sum)
|
||||
{
|
||||
memcpy(dst,src,len);
|
||||
return csum_partial(dst, len, sum);
|
||||
}
|
||||
|
||||
/*
|
||||
* Fold a partial checksum without adding pseudo headers
|
||||
*/
|
||||
static inline __sum16 csum_fold(__wsum sum)
|
||||
{
|
||||
#ifndef __s390x__
|
||||
register_pair rp;
|
||||
|
||||
asm volatile(
|
||||
" slr %N1,%N1\n" /* %0 = H L */
|
||||
" lr %1,%0\n" /* %0 = H L, %1 = H L 0 0 */
|
||||
" srdl %1,16\n" /* %0 = H L, %1 = 0 H L 0 */
|
||||
" alr %1,%N1\n" /* %0 = H L, %1 = L H L 0 */
|
||||
" alr %0,%1\n" /* %0 = H+L+C L+H */
|
||||
" srl %0,16\n" /* %0 = H+L+C */
|
||||
: "+&d" (sum), "=d" (rp) : : "cc");
|
||||
#else /* __s390x__ */
|
||||
asm volatile(
|
||||
" sr 3,3\n" /* %0 = H*65536 + L */
|
||||
" lr 2,%0\n" /* %0 = H L, 2/3 = H L / 0 0 */
|
||||
" srdl 2,16\n" /* %0 = H L, 2/3 = 0 H / L 0 */
|
||||
" alr 2,3\n" /* %0 = H L, 2/3 = L H / L 0 */
|
||||
" alr %0,2\n" /* %0 = H+L+C L+H */
|
||||
" srl %0,16\n" /* %0 = H+L+C */
|
||||
: "+&d" (sum) : : "cc", "2", "3");
|
||||
#endif /* __s390x__ */
|
||||
return (__force __sum16) ~sum;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a version of ip_compute_csum() optimized for IP headers,
|
||||
* which always checksum on 4 octet boundaries.
|
||||
*
|
||||
*/
|
||||
static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl)
|
||||
{
|
||||
return csum_fold(csum_partial(iph, ihl*4, 0));
|
||||
}
|
||||
|
||||
/*
|
||||
* computes the checksum of the TCP/UDP pseudo-header
|
||||
* returns a 32-bit checksum
|
||||
*/
|
||||
static inline __wsum
|
||||
csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
|
||||
unsigned short len, unsigned short proto,
|
||||
__wsum sum)
|
||||
{
|
||||
__u32 csum = (__force __u32)sum;
|
||||
|
||||
csum += (__force __u32)saddr;
|
||||
if (csum < (__force __u32)saddr)
|
||||
csum++;
|
||||
|
||||
csum += (__force __u32)daddr;
|
||||
if (csum < (__force __u32)daddr)
|
||||
csum++;
|
||||
|
||||
csum += len + proto;
|
||||
if (csum < len + proto)
|
||||
csum++;
|
||||
|
||||
return (__force __wsum)csum;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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));
|
||||
}
|
||||
|
||||
/*
|
||||
* this routine is used for miscellaneous IP-like checksums, mainly
|
||||
* in icmp.c
|
||||
*/
|
||||
|
||||
static inline __sum16 ip_compute_csum(const void *buff, int len)
|
||||
{
|
||||
return csum_fold(csum_partial(buff, len, 0));
|
||||
}
|
||||
|
||||
#endif /* _S390_CHECKSUM_H */
|
||||
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* drivers/s390/cio/chpid.h
|
||||
*
|
||||
* Copyright IBM Corp. 2007
|
||||
* Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
|
||||
*/
|
||||
|
||||
#ifndef _ASM_S390_CHPID_H
|
||||
#define _ASM_S390_CHPID_H _ASM_S390_CHPID_H
|
||||
|
||||
#include <linux/string.h>
|
||||
#include <asm/types.h>
|
||||
|
||||
#define __MAX_CHPID 255
|
||||
|
||||
struct chp_id {
|
||||
u8 reserved1;
|
||||
u8 cssid;
|
||||
u8 reserved2;
|
||||
u8 id;
|
||||
} __attribute__((packed));
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <asm/cio.h>
|
||||
|
||||
static inline void chp_id_init(struct chp_id *chpid)
|
||||
{
|
||||
memset(chpid, 0, sizeof(struct chp_id));
|
||||
}
|
||||
|
||||
static inline int chp_id_is_equal(struct chp_id *a, struct chp_id *b)
|
||||
{
|
||||
return (a->id == b->id) && (a->cssid == b->cssid);
|
||||
}
|
||||
|
||||
static inline void chp_id_next(struct chp_id *chpid)
|
||||
{
|
||||
if (chpid->id < __MAX_CHPID)
|
||||
chpid->id++;
|
||||
else {
|
||||
chpid->id = 0;
|
||||
chpid->cssid++;
|
||||
}
|
||||
}
|
||||
|
||||
static inline int chp_id_is_valid(struct chp_id *chpid)
|
||||
{
|
||||
return (chpid->cssid <= __MAX_CSSID);
|
||||
}
|
||||
|
||||
|
||||
#define chp_id_for_each(c) \
|
||||
for (chp_id_init(c); chp_id_is_valid(c); chp_id_next(c))
|
||||
#endif /* __KERNEL */
|
||||
|
||||
#endif /* _ASM_S390_CHPID_H */
|
||||
@@ -0,0 +1,127 @@
|
||||
/*
|
||||
* ioctl interface for /dev/chsc
|
||||
*
|
||||
* Copyright 2008 IBM Corp.
|
||||
* Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
|
||||
*/
|
||||
|
||||
#ifndef _ASM_CHSC_H
|
||||
#define _ASM_CHSC_H
|
||||
|
||||
#include <asm/chpid.h>
|
||||
#include <asm/schid.h>
|
||||
|
||||
struct chsc_async_header {
|
||||
__u16 length;
|
||||
__u16 code;
|
||||
__u32 cmd_dependend;
|
||||
__u32 key : 4;
|
||||
__u32 : 28;
|
||||
struct subchannel_id sid;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct chsc_async_area {
|
||||
struct chsc_async_header header;
|
||||
__u8 data[PAGE_SIZE - 16 /* size of chsc_async_header */];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
struct chsc_response_struct {
|
||||
__u16 length;
|
||||
__u16 code;
|
||||
__u32 parms;
|
||||
__u8 data[PAGE_SIZE - 8];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct chsc_chp_cd {
|
||||
struct chp_id chpid;
|
||||
int m;
|
||||
int fmt;
|
||||
struct chsc_response_struct cpcb;
|
||||
};
|
||||
|
||||
struct chsc_cu_cd {
|
||||
__u16 cun;
|
||||
__u8 cssid;
|
||||
int m;
|
||||
int fmt;
|
||||
struct chsc_response_struct cucb;
|
||||
};
|
||||
|
||||
struct chsc_sch_cud {
|
||||
struct subchannel_id schid;
|
||||
int fmt;
|
||||
struct chsc_response_struct scub;
|
||||
};
|
||||
|
||||
struct conf_id {
|
||||
int m;
|
||||
__u8 cssid;
|
||||
__u8 ssid;
|
||||
};
|
||||
|
||||
struct chsc_conf_info {
|
||||
struct conf_id id;
|
||||
int fmt;
|
||||
struct chsc_response_struct scid;
|
||||
};
|
||||
|
||||
struct ccl_parm_chpid {
|
||||
int m;
|
||||
struct chp_id chp;
|
||||
};
|
||||
|
||||
struct ccl_parm_cssids {
|
||||
__u8 f_cssid;
|
||||
__u8 l_cssid;
|
||||
};
|
||||
|
||||
struct chsc_comp_list {
|
||||
struct {
|
||||
enum {
|
||||
CCL_CU_ON_CHP = 1,
|
||||
CCL_CHP_TYPE_CAP = 2,
|
||||
CCL_CSS_IMG = 4,
|
||||
CCL_CSS_IMG_CONF_CHAR = 5,
|
||||
CCL_IOP_CHP = 6,
|
||||
} ctype;
|
||||
int fmt;
|
||||
struct ccl_parm_chpid chpid;
|
||||
struct ccl_parm_cssids cssids;
|
||||
} req;
|
||||
struct chsc_response_struct sccl;
|
||||
};
|
||||
|
||||
struct chsc_dcal {
|
||||
struct {
|
||||
enum {
|
||||
DCAL_CSS_IID_PN = 4,
|
||||
} atype;
|
||||
__u32 list_parm[2];
|
||||
int fmt;
|
||||
} req;
|
||||
struct chsc_response_struct sdcal;
|
||||
};
|
||||
|
||||
struct chsc_cpd_info {
|
||||
struct chp_id chpid;
|
||||
int m;
|
||||
int fmt;
|
||||
int rfmt;
|
||||
int c;
|
||||
struct chsc_response_struct chpdb;
|
||||
};
|
||||
|
||||
#define CHSC_IOCTL_MAGIC 'c'
|
||||
|
||||
#define CHSC_START _IOWR(CHSC_IOCTL_MAGIC, 0x81, struct chsc_async_area)
|
||||
#define CHSC_INFO_CHANNEL_PATH _IOWR(CHSC_IOCTL_MAGIC, 0x82, \
|
||||
struct chsc_chp_cd)
|
||||
#define CHSC_INFO_CU _IOWR(CHSC_IOCTL_MAGIC, 0x83, struct chsc_cu_cd)
|
||||
#define CHSC_INFO_SCH_CU _IOWR(CHSC_IOCTL_MAGIC, 0x84, struct chsc_sch_cud)
|
||||
#define CHSC_INFO_CI _IOWR(CHSC_IOCTL_MAGIC, 0x85, struct chsc_conf_info)
|
||||
#define CHSC_INFO_CCL _IOWR(CHSC_IOCTL_MAGIC, 0x86, struct chsc_comp_list)
|
||||
#define CHSC_INFO_CPD _IOWR(CHSC_IOCTL_MAGIC, 0x87, struct chsc_cpd_info)
|
||||
#define CHSC_INFO_DCAL _IOWR(CHSC_IOCTL_MAGIC, 0x88, struct chsc_dcal)
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,58 @@
|
||||
#ifndef S390_CMB_H
|
||||
#define S390_CMB_H
|
||||
/**
|
||||
* struct cmbdata - channel measurement block data for user space
|
||||
* @size: size of the stored data
|
||||
* @elapsed_time: time since last sampling
|
||||
* @ssch_rsch_count: number of ssch and rsch
|
||||
* @sample_count: number of samples
|
||||
* @device_connect_time: time of device connect
|
||||
* @function_pending_time: time of function pending
|
||||
* @device_disconnect_time: time of device disconnect
|
||||
* @control_unit_queuing_time: time of control unit queuing
|
||||
* @device_active_only_time: time of device active only
|
||||
* @device_busy_time: time of device busy (ext. format)
|
||||
* @initial_command_response_time: initial command response time (ext. format)
|
||||
*
|
||||
* All values are stored as 64 bit for simplicity, especially
|
||||
* in 32 bit emulation mode. All time values are normalized to
|
||||
* nanoseconds.
|
||||
* Currently, two formats are known, which differ by the size of
|
||||
* this structure, i.e. the last two members are only set when
|
||||
* the extended channel measurement facility (first shipped in
|
||||
* z990 machines) is activated.
|
||||
* Potentially, more fields could be added, which would result in a
|
||||
* new ioctl number.
|
||||
*/
|
||||
struct cmbdata {
|
||||
__u64 size;
|
||||
__u64 elapsed_time;
|
||||
/* basic and exended format: */
|
||||
__u64 ssch_rsch_count;
|
||||
__u64 sample_count;
|
||||
__u64 device_connect_time;
|
||||
__u64 function_pending_time;
|
||||
__u64 device_disconnect_time;
|
||||
__u64 control_unit_queuing_time;
|
||||
__u64 device_active_only_time;
|
||||
/* extended format only: */
|
||||
__u64 device_busy_time;
|
||||
__u64 initial_command_response_time;
|
||||
};
|
||||
|
||||
/* enable channel measurement */
|
||||
#define BIODASDCMFENABLE _IO(DASD_IOCTL_LETTER, 32)
|
||||
/* enable channel measurement */
|
||||
#define BIODASDCMFDISABLE _IO(DASD_IOCTL_LETTER, 33)
|
||||
/* read channel measurement data */
|
||||
#define BIODASDREADALLCMB _IOWR(DASD_IOCTL_LETTER, 33, struct cmbdata)
|
||||
|
||||
#ifdef __KERNEL__
|
||||
struct ccw_device;
|
||||
extern int enable_cmf(struct ccw_device *cdev);
|
||||
extern int disable_cmf(struct ccw_device *cdev);
|
||||
extern u64 cmf_read(struct ccw_device *cdev, int index);
|
||||
extern int cmf_readall(struct ccw_device *cdev, struct cmbdata *data);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* S390_CMB_H */
|
||||
@@ -0,0 +1,233 @@
|
||||
#ifndef _ASM_S390X_COMPAT_H
|
||||
#define _ASM_S390X_COMPAT_H
|
||||
/*
|
||||
* Architecture specific compatibility types
|
||||
*/
|
||||
#include <linux/types.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#define PSW32_MASK_PER 0x40000000UL
|
||||
#define PSW32_MASK_DAT 0x04000000UL
|
||||
#define PSW32_MASK_IO 0x02000000UL
|
||||
#define PSW32_MASK_EXT 0x01000000UL
|
||||
#define PSW32_MASK_KEY 0x00F00000UL
|
||||
#define PSW32_MASK_MCHECK 0x00040000UL
|
||||
#define PSW32_MASK_WAIT 0x00020000UL
|
||||
#define PSW32_MASK_PSTATE 0x00010000UL
|
||||
#define PSW32_MASK_ASC 0x0000C000UL
|
||||
#define PSW32_MASK_CC 0x00003000UL
|
||||
#define PSW32_MASK_PM 0x00000f00UL
|
||||
|
||||
#define PSW32_ADDR_AMODE31 0x80000000UL
|
||||
#define PSW32_ADDR_INSN 0x7FFFFFFFUL
|
||||
|
||||
#define PSW32_BASE_BITS 0x00080000UL
|
||||
|
||||
#define PSW32_ASC_PRIMARY 0x00000000UL
|
||||
#define PSW32_ASC_ACCREG 0x00004000UL
|
||||
#define PSW32_ASC_SECONDARY 0x00008000UL
|
||||
#define PSW32_ASC_HOME 0x0000C000UL
|
||||
|
||||
#define PSW32_MASK_MERGE(CURRENT,NEW) \
|
||||
(((CURRENT) & ~(PSW32_MASK_CC|PSW32_MASK_PM)) | \
|
||||
((NEW) & (PSW32_MASK_CC|PSW32_MASK_PM)))
|
||||
|
||||
extern long psw32_user_bits;
|
||||
|
||||
#define COMPAT_USER_HZ 100
|
||||
|
||||
typedef u32 compat_size_t;
|
||||
typedef s32 compat_ssize_t;
|
||||
typedef s32 compat_time_t;
|
||||
typedef s32 compat_clock_t;
|
||||
typedef s32 compat_pid_t;
|
||||
typedef u16 __compat_uid_t;
|
||||
typedef u16 __compat_gid_t;
|
||||
typedef u32 __compat_uid32_t;
|
||||
typedef u32 __compat_gid32_t;
|
||||
typedef u16 compat_mode_t;
|
||||
typedef u32 compat_ino_t;
|
||||
typedef u16 compat_dev_t;
|
||||
typedef s32 compat_off_t;
|
||||
typedef s64 compat_loff_t;
|
||||
typedef u16 compat_nlink_t;
|
||||
typedef u16 compat_ipc_pid_t;
|
||||
typedef s32 compat_daddr_t;
|
||||
typedef u32 compat_caddr_t;
|
||||
typedef __kernel_fsid_t compat_fsid_t;
|
||||
typedef s32 compat_key_t;
|
||||
typedef s32 compat_timer_t;
|
||||
|
||||
typedef s32 compat_int_t;
|
||||
typedef s32 compat_long_t;
|
||||
typedef s64 compat_s64;
|
||||
typedef u32 compat_uint_t;
|
||||
typedef u32 compat_ulong_t;
|
||||
typedef u64 compat_u64;
|
||||
|
||||
struct compat_timespec {
|
||||
compat_time_t tv_sec;
|
||||
s32 tv_nsec;
|
||||
};
|
||||
|
||||
struct compat_timeval {
|
||||
compat_time_t tv_sec;
|
||||
s32 tv_usec;
|
||||
};
|
||||
|
||||
struct compat_stat {
|
||||
compat_dev_t st_dev;
|
||||
u16 __pad1;
|
||||
compat_ino_t st_ino;
|
||||
compat_mode_t st_mode;
|
||||
compat_nlink_t st_nlink;
|
||||
__compat_uid_t st_uid;
|
||||
__compat_gid_t st_gid;
|
||||
compat_dev_t st_rdev;
|
||||
u16 __pad2;
|
||||
u32 st_size;
|
||||
u32 st_blksize;
|
||||
u32 st_blocks;
|
||||
u32 st_atime;
|
||||
u32 st_atime_nsec;
|
||||
u32 st_mtime;
|
||||
u32 st_mtime_nsec;
|
||||
u32 st_ctime;
|
||||
u32 st_ctime_nsec;
|
||||
u32 __unused4;
|
||||
u32 __unused5;
|
||||
};
|
||||
|
||||
struct compat_flock {
|
||||
short l_type;
|
||||
short l_whence;
|
||||
compat_off_t l_start;
|
||||
compat_off_t l_len;
|
||||
compat_pid_t l_pid;
|
||||
};
|
||||
|
||||
#define F_GETLK64 12
|
||||
#define F_SETLK64 13
|
||||
#define F_SETLKW64 14
|
||||
|
||||
struct compat_flock64 {
|
||||
short l_type;
|
||||
short l_whence;
|
||||
compat_loff_t l_start;
|
||||
compat_loff_t l_len;
|
||||
compat_pid_t l_pid;
|
||||
};
|
||||
|
||||
struct compat_statfs {
|
||||
s32 f_type;
|
||||
s32 f_bsize;
|
||||
s32 f_blocks;
|
||||
s32 f_bfree;
|
||||
s32 f_bavail;
|
||||
s32 f_files;
|
||||
s32 f_ffree;
|
||||
compat_fsid_t f_fsid;
|
||||
s32 f_namelen;
|
||||
s32 f_frsize;
|
||||
s32 f_spare[6];
|
||||
};
|
||||
|
||||
#define COMPAT_RLIM_OLD_INFINITY 0x7fffffff
|
||||
#define COMPAT_RLIM_INFINITY 0xffffffff
|
||||
|
||||
typedef u32 compat_old_sigset_t; /* at least 32 bits */
|
||||
|
||||
#define _COMPAT_NSIG 64
|
||||
#define _COMPAT_NSIG_BPW 32
|
||||
|
||||
typedef u32 compat_sigset_word;
|
||||
|
||||
#define COMPAT_OFF_T_MAX 0x7fffffff
|
||||
#define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL
|
||||
|
||||
/*
|
||||
* A pointer passed in from user mode. This should not
|
||||
* be used for syscall parameters, just declare them
|
||||
* as pointers because the syscall entry code will have
|
||||
* appropriately converted them already.
|
||||
*/
|
||||
typedef u32 compat_uptr_t;
|
||||
|
||||
static inline void __user *compat_ptr(compat_uptr_t uptr)
|
||||
{
|
||||
return (void __user *)(unsigned long)(uptr & 0x7fffffffUL);
|
||||
}
|
||||
|
||||
static inline compat_uptr_t ptr_to_compat(void __user *uptr)
|
||||
{
|
||||
return (u32)(unsigned long)uptr;
|
||||
}
|
||||
|
||||
static inline void __user *compat_alloc_user_space(long len)
|
||||
{
|
||||
unsigned long stack;
|
||||
|
||||
stack = KSTK_ESP(current);
|
||||
if (test_thread_flag(TIF_31BIT))
|
||||
stack &= 0x7fffffffUL;
|
||||
return (void __user *) (stack - len);
|
||||
}
|
||||
|
||||
struct compat_ipc64_perm {
|
||||
compat_key_t key;
|
||||
__compat_uid32_t uid;
|
||||
__compat_gid32_t gid;
|
||||
__compat_uid32_t cuid;
|
||||
__compat_gid32_t cgid;
|
||||
compat_mode_t mode;
|
||||
unsigned short __pad1;
|
||||
unsigned short seq;
|
||||
unsigned short __pad2;
|
||||
unsigned int __unused1;
|
||||
unsigned int __unused2;
|
||||
};
|
||||
|
||||
struct compat_semid64_ds {
|
||||
struct compat_ipc64_perm sem_perm;
|
||||
compat_time_t sem_otime;
|
||||
compat_ulong_t __pad1;
|
||||
compat_time_t sem_ctime;
|
||||
compat_ulong_t __pad2;
|
||||
compat_ulong_t sem_nsems;
|
||||
compat_ulong_t __unused1;
|
||||
compat_ulong_t __unused2;
|
||||
};
|
||||
|
||||
struct compat_msqid64_ds {
|
||||
struct compat_ipc64_perm msg_perm;
|
||||
compat_time_t msg_stime;
|
||||
compat_ulong_t __pad1;
|
||||
compat_time_t msg_rtime;
|
||||
compat_ulong_t __pad2;
|
||||
compat_time_t msg_ctime;
|
||||
compat_ulong_t __pad3;
|
||||
compat_ulong_t msg_cbytes;
|
||||
compat_ulong_t msg_qnum;
|
||||
compat_ulong_t msg_qbytes;
|
||||
compat_pid_t msg_lspid;
|
||||
compat_pid_t msg_lrpid;
|
||||
compat_ulong_t __unused1;
|
||||
compat_ulong_t __unused2;
|
||||
};
|
||||
|
||||
struct compat_shmid64_ds {
|
||||
struct compat_ipc64_perm shm_perm;
|
||||
compat_size_t shm_segsz;
|
||||
compat_time_t shm_atime;
|
||||
compat_ulong_t __pad1;
|
||||
compat_time_t shm_dtime;
|
||||
compat_ulong_t __pad2;
|
||||
compat_time_t shm_ctime;
|
||||
compat_ulong_t __pad3;
|
||||
compat_pid_t shm_cpid;
|
||||
compat_pid_t shm_lpid;
|
||||
compat_ulong_t shm_nattch;
|
||||
compat_ulong_t __unused1;
|
||||
compat_ulong_t __unused2;
|
||||
};
|
||||
#endif /* _ASM_S390X_COMPAT_H */
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* arch/s390/kernel/cpcmd.h
|
||||
*
|
||||
* S390 version
|
||||
* Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
|
||||
* Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
|
||||
* Christian Borntraeger (cborntra@de.ibm.com),
|
||||
*/
|
||||
|
||||
#ifndef _ASM_S390_CPCMD_H
|
||||
#define _ASM_S390_CPCMD_H
|
||||
|
||||
/*
|
||||
* the lowlevel function for cpcmd
|
||||
* the caller of __cpcmd has to ensure that the response buffer is below 2 GB
|
||||
*/
|
||||
extern int __cpcmd(const char *cmd, char *response, int rlen, int *response_code);
|
||||
|
||||
/*
|
||||
* cpcmd is the in-kernel interface for issuing CP commands
|
||||
*
|
||||
* cmd: null-terminated command string, max 240 characters
|
||||
* response: response buffer for VM's textual response
|
||||
* rlen: size of the response buffer, cpcmd will not exceed this size
|
||||
* but will cap the output, if its too large. Everything that
|
||||
* did not fit into the buffer will be silently dropped
|
||||
* response_code: return pointer for VM's error code
|
||||
* return value: the size of the response. The caller can check if the buffer
|
||||
* was large enough by comparing the return value and rlen
|
||||
* NOTE: If the response buffer is not below 2 GB, cpcmd can sleep
|
||||
*/
|
||||
extern int cpcmd(const char *cmd, char *response, int rlen, int *response_code);
|
||||
|
||||
#endif /* _ASM_S390_CPCMD_H */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user