Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 107060
b: refs/heads/master
c: a47d5da
h: refs/heads/master
v: v3
  • Loading branch information
Dean Nelson authored and Linus Torvalds committed Jul 30, 2008
1 parent 007639a commit 01da0fe
Show file tree
Hide file tree
Showing 7 changed files with 785 additions and 807 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6e41017aad9ed175ca51e4828eabc8c5cf5910be
refs/heads/master: a47d5dac9d8481766382f8cf1483dd581df38b99
173 changes: 97 additions & 76 deletions trunk/drivers/misc/sgi-xp/xpc.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,6 @@ struct xpc_rsvd_page {

#define XPC_RP_VERSION _XPC_VERSION(2, 0) /* version 2.0 of the reserved page */

#define XPC_SUPPORTS_RP_STAMP(_version) \
(_version >= _XPC_VERSION(1, 1))

/*
* Define the structures by which XPC variables can be exported to other
* partitions. (There are two: struct xpc_vars and struct xpc_vars_part)
Expand All @@ -144,18 +141,15 @@ struct xpc_vars_sn2 {
u64 heartbeat;
DECLARE_BITMAP(heartbeating_to_mask, XP_MAX_NPARTITIONS_SN2);
u64 heartbeat_offline; /* if 0, heartbeat should be changing */
int act_nasid;
int act_phys_cpuid;
int activate_IRQ_nasid;
int activate_IRQ_phys_cpuid;
u64 vars_part_pa;
u64 amos_page_pa; /* paddr of page of AMOs from MSPEC driver */
AMO_t *amos_page; /* vaddr of page of AMOs from MSPEC driver */
};

#define XPC_V_VERSION _XPC_VERSION(3, 1) /* version 3.1 of the cross vars */

#define XPC_SUPPORTS_DISENGAGE_REQUEST(_version) \
(_version >= _XPC_VERSION(3, 1))

/*
* The following pertains to ia64-sn2 only.
*
Expand All @@ -167,14 +161,14 @@ struct xpc_vars_sn2 {
* a PI FSB Protocol error to be generated by the SHUB. For XPC, we need 64
* AMO variables (based on XP_MAX_NPARTITIONS_SN2) to identify the senders of
* NOTIFY IRQs, 128 AMO variables (based on XP_NASID_MASK_WORDS) to identify
* the senders of ACTIVATE IRQs, and 2 AMO variables to identify which remote
* the senders of ACTIVATE IRQs, 1 AMO variable to identify which remote
* partitions (i.e., XPCs) consider themselves currently engaged with the
* local XPC.
* local XPC and 1 AMO variable to request partition deactivation.
*/
#define XPC_NOTIFY_IRQ_AMOS 0
#define XPC_ACTIVATE_IRQ_AMOS (XPC_NOTIFY_IRQ_AMOS + XP_MAX_NPARTITIONS_SN2)
#define XPC_ENGAGED_PARTITIONS_AMO (XPC_ACTIVATE_IRQ_AMOS + XP_NASID_MASK_WORDS)
#define XPC_DISENGAGE_REQUEST_AMO (XPC_ENGAGED_PARTITIONS_AMO + 1)
#define XPC_DEACTIVATE_REQUEST_AMO (XPC_ENGAGED_PARTITIONS_AMO + 1)

/*
* The following structure describes the per partition specific variables.
Expand Down Expand Up @@ -369,6 +363,23 @@ struct xpc_notify {
* new messages, by the clearing of the message flags of the acknowledged
* messages.
*/
struct xpc_channel_sn2 {

/* various flavors of local and remote Get/Put values */

struct xpc_gp *local_GP; /* local Get/Put values */
struct xpc_gp remote_GP; /* remote Get/Put values */
struct xpc_gp w_local_GP; /* working local Get/Put values */
struct xpc_gp w_remote_GP; /* working remote Get/Put values */
s64 next_msg_to_pull; /* Put value of next msg to pull */

struct mutex msg_to_pull_mutex; /* next msg to pull serialization */
};

struct xpc_channel_uv {
/* >>> code is coming */
};

struct xpc_channel {
short partid; /* ID of remote partition connected */
spinlock_t lock; /* lock for updating this structure */
Expand Down Expand Up @@ -407,20 +418,11 @@ struct xpc_channel {
xpc_channel_func func; /* user's channel function */
void *key; /* pointer to user's key */

struct mutex msg_to_pull_mutex; /* next msg to pull serialization */
struct completion wdisconnect_wait; /* wait for channel disconnect */

struct xpc_openclose_args *local_openclose_args; /* args passed on */
/* opening or closing of channel */

/* various flavors of local and remote Get/Put values */

struct xpc_gp *local_GP; /* local Get/Put values */
struct xpc_gp remote_GP; /* remote Get/Put values */
struct xpc_gp w_local_GP; /* working local Get/Put values */
struct xpc_gp w_remote_GP; /* working remote Get/Put values */
s64 next_msg_to_pull; /* Put value of next msg to pull */

/* kthread management related fields */

atomic_t kthreads_assigned; /* #of kthreads assigned to channel */
Expand All @@ -431,6 +433,11 @@ struct xpc_channel {

wait_queue_head_t idle_wq; /* idle kthread wait queue */

union {
struct xpc_channel_sn2 sn2;
struct xpc_channel_uv uv;
} sn;

} ____cacheline_aligned;

/* struct xpc_channel flags */
Expand Down Expand Up @@ -467,29 +474,56 @@ struct xpc_channel {
* for each partition (a partition will never utilize the structure that
* represents itself).
*/

struct xpc_partition_sn2 {
u64 remote_amos_page_pa; /* phys addr of partition's amos page */
int activate_IRQ_nasid; /* active partition's act/deact nasid */
int activate_IRQ_phys_cpuid; /* active part's act/deact phys cpuid */

u64 remote_vars_pa; /* phys addr of partition's vars */
u64 remote_vars_part_pa; /* phys addr of partition's vars part */
u8 remote_vars_version; /* version# of partition's vars */

void *local_GPs_base; /* base address of kmalloc'd space */
struct xpc_gp *local_GPs; /* local Get/Put values */
void *remote_GPs_base; /* base address of kmalloc'd space */
struct xpc_gp *remote_GPs; /* copy of remote partition's local */
/* Get/Put values */
u64 remote_GPs_pa; /* phys address of remote partition's local */
/* Get/Put values */

u64 remote_openclose_args_pa; /* phys addr of remote's args */

int remote_IPI_nasid; /* nasid of where to send IPIs */
int remote_IPI_phys_cpuid; /* phys CPU ID of where to send IPIs */
char IPI_owner[8]; /* IPI owner's name */

AMO_t *remote_IPI_amo_va; /* address of remote IPI AMO_t structure */
AMO_t *local_IPI_amo_va; /* address of IPI AMO_t structure */

struct timer_list dropped_notify_IRQ_timer; /* dropped IRQ timer */
};

struct xpc_partition_uv {
/* >>> code is coming */
};

struct xpc_partition {

/* XPC HB infrastructure */

u8 remote_rp_version; /* version# of partition's rsvd pg */
unsigned long remote_rp_stamp; /* time when rsvd pg was initialized */
u64 remote_rp_pa; /* phys addr of partition's rsvd pg */
u64 remote_vars_pa; /* phys addr of partition's vars */
u64 remote_vars_part_pa; /* phys addr of partition's vars part */
u64 last_heartbeat; /* HB at last read */
u64 remote_amos_page_pa; /* phys addr of partition's amos page */
int remote_act_nasid; /* active part's act/deact nasid */
int remote_act_phys_cpuid; /* active part's act/deact phys cpuid */
u32 activate_IRQ_rcvd; /* IRQs since activation */
spinlock_t act_lock; /* protect updating of act_state */
u8 act_state; /* from XPC HB viewpoint */
u8 remote_vars_version; /* version# of partition's vars */
enum xp_retval reason; /* reason partition is deactivating */
int reason_line; /* line# deactivation initiated from */
int reactivate_nasid; /* nasid in partition to reactivate */

unsigned long disengage_request_timeout; /* timeout in jiffies */
struct timer_list disengage_request_timer;
unsigned long disengage_timeout; /* timeout in jiffies */
struct timer_list disengage_timer;

/* XPC infrastructure referencing and teardown control */

Expand All @@ -502,41 +536,29 @@ struct xpc_partition {
atomic_t nchannels_engaged; /* #of channels engaged with remote part */
struct xpc_channel *channels; /* array of channel structures */

void *local_GPs_base; /* base address of kmalloc'd space */
struct xpc_gp *local_GPs; /* local Get/Put values */
void *remote_GPs_base; /* base address of kmalloc'd space */
struct xpc_gp *remote_GPs; /* copy of remote partition's local */
/* Get/Put values */
u64 remote_GPs_pa; /* phys address of remote partition's local */
/* Get/Put values */

/* fields used to pass args when opening or closing a channel */

void *local_openclose_args_base; /* base address of kmalloc'd space */
struct xpc_openclose_args *local_openclose_args; /* local's args */
void *remote_openclose_args_base; /* base address of kmalloc'd space */
struct xpc_openclose_args *remote_openclose_args; /* copy of remote's */
/* args */
u64 remote_openclose_args_pa; /* phys addr of remote's args */

/* IPI sending, receiving and handling related fields */

int remote_IPI_nasid; /* nasid of where to send IPIs */
int remote_IPI_phys_cpuid; /* phys CPU ID of where to send IPIs */
AMO_t *remote_IPI_amo_va; /* address of remote IPI AMO_t structure */

AMO_t *local_IPI_amo_va; /* address of IPI AMO_t structure */
u64 local_IPI_amo; /* IPI amo flags yet to be handled */
char IPI_owner[8]; /* IPI owner's name */
struct timer_list dropped_IPI_timer; /* dropped IPI timer */

spinlock_t IPI_lock; /* IPI handler lock */

/* channel manager related fields */

atomic_t channel_mgr_requests; /* #of requests to activate chan mgr */
wait_queue_head_t channel_mgr_wq; /* channel mgr's wait queue */

union {
struct xpc_partition_sn2 sn2;
struct xpc_partition_uv uv;
} sn;

} ____cacheline_aligned;

/* struct xpc_partition act_state values (for XPC HB) */
Expand Down Expand Up @@ -565,10 +587,10 @@ struct xpc_partition {
#define XPC_P_DROPPED_IPI_WAIT_INTERVAL (0.25 * HZ)

/* number of seconds to wait for other partitions to disengage */
#define XPC_DISENGAGE_REQUEST_DEFAULT_TIMELIMIT 90
#define XPC_DISENGAGE_DEFAULT_TIMELIMIT 90

/* interval in seconds to print 'waiting disengagement' messages */
#define XPC_DISENGAGE_PRINTMSG_INTERVAL 10
/* interval in seconds to print 'waiting deactivation' messages */
#define XPC_DEACTIVATE_PRINTMSG_INTERVAL 10

#define XPC_PARTID(_p) ((short)((_p) - &xpc_partitions[0]))

Expand All @@ -578,13 +600,11 @@ extern struct xpc_registration xpc_registrations[];
/* found in xpc_main.c */
extern struct device *xpc_part;
extern struct device *xpc_chan;
extern int xpc_disengage_request_timelimit;
extern int xpc_disengage_request_timedout;
extern int xpc_disengage_timelimit;
extern int xpc_disengage_timedout;
extern atomic_t xpc_activate_IRQ_rcvd;
extern wait_queue_head_t xpc_activate_IRQ_wq;
extern void *xpc_heartbeating_to_mask;
extern irqreturn_t xpc_notify_IRQ_handler(int, void *);
extern void xpc_dropped_IPI_check(struct xpc_partition *);
extern void xpc_activate_partition(struct xpc_partition *);
extern void xpc_activate_kthreads(struct xpc_channel *, int);
extern void xpc_create_kthreads(struct xpc_channel *, int, int);
Expand All @@ -598,31 +618,34 @@ extern void (*xpc_online_heartbeat) (void);
extern void (*xpc_check_remote_hb) (void);
extern enum xp_retval (*xpc_make_first_contact) (struct xpc_partition *);
extern u64 (*xpc_get_IPI_flags) (struct xpc_partition *);
extern void (*xpc_notify_senders_of_disconnect) (struct xpc_channel *);
extern void (*xpc_process_msg_IPI) (struct xpc_partition *, int);
extern int (*xpc_n_of_deliverable_msgs) (struct xpc_channel *);
extern struct xpc_msg *(*xpc_get_deliverable_msg) (struct xpc_channel *);
extern void (*xpc_initiate_partition_activation) (struct xpc_rsvd_page *, u64,
int);
extern void (*xpc_request_partition_activation) (struct xpc_rsvd_page *, u64,
int);
extern void (*xpc_request_partition_reactivation) (struct xpc_partition *);
extern void (*xpc_request_partition_deactivation) (struct xpc_partition *);
extern void (*xpc_cancel_partition_deactivation_request) (
struct xpc_partition *);
extern void (*xpc_process_activate_IRQ_rcvd) (int);
extern enum xp_retval (*xpc_setup_infrastructure) (struct xpc_partition *);
extern void (*xpc_teardown_infrastructure) (struct xpc_partition *);
extern void (*xpc_mark_partition_engaged) (struct xpc_partition *);
extern void (*xpc_mark_partition_disengaged) (struct xpc_partition *);
extern void (*xpc_request_partition_disengage) (struct xpc_partition *);
extern void (*xpc_cancel_partition_disengage_request) (struct xpc_partition *);
extern u64 (*xpc_partition_engaged) (u64);
extern u64 (*xpc_partition_disengage_requested) (u64);;
extern void (*xpc_clear_partition_engaged) (u64);
extern void (*xpc_clear_partition_disengage_request) (u64);

extern void (*xpc_IPI_send_local_activate) (int);
extern void (*xpc_IPI_send_activated) (struct xpc_partition *);
extern void (*xpc_IPI_send_local_reactivate) (int);
extern void (*xpc_IPI_send_disengage) (struct xpc_partition *);

extern void (*xpc_IPI_send_closerequest) (struct xpc_channel *,
unsigned long *);
extern void (*xpc_IPI_send_closereply) (struct xpc_channel *, unsigned long *);
extern void (*xpc_IPI_send_openrequest) (struct xpc_channel *, unsigned long *);
extern void (*xpc_IPI_send_openreply) (struct xpc_channel *, unsigned long *);

extern void (*xpc_indicate_partition_engaged) (struct xpc_partition *);
extern int (*xpc_partition_engaged) (short);
extern int (*xpc_any_partition_engaged) (void);
extern void (*xpc_indicate_partition_disengaged) (struct xpc_partition *);
extern void (*xpc_assume_partition_disengaged) (short);

extern void (*xpc_send_channel_closerequest) (struct xpc_channel *,
unsigned long *);
extern void (*xpc_send_channel_closereply) (struct xpc_channel *,
unsigned long *);
extern void (*xpc_send_channel_openrequest) (struct xpc_channel *,
unsigned long *);
extern void (*xpc_send_channel_openreply) (struct xpc_channel *,
unsigned long *);

extern enum xp_retval (*xpc_send_msg) (struct xpc_channel *, u32, void *, u16,
u8, xpc_notify_func, void *);
Expand All @@ -646,8 +669,6 @@ extern char *xpc_remote_copy_buffer;
extern void *xpc_remote_copy_buffer_base;
extern void *xpc_kmalloc_cacheline_aligned(size_t, gfp_t, void **);
extern struct xpc_rsvd_page *xpc_setup_rsvd_page(void);
extern void xpc_allow_IPI_ops(void);
extern void xpc_restrict_IPI_ops(void);
extern int xpc_identify_activate_IRQ_sender(void);
extern int xpc_partition_disengaged(struct xpc_partition *);
extern enum xp_retval xpc_mark_partition_active(struct xpc_partition *);
Expand Down
Loading

0 comments on commit 01da0fe

Please sign in to comment.