summaryrefslogtreecommitdiffstats
path: root/drivers/misc/sgi-xp/xpc_uv.c
blob: 232867aa69296eb33ddfbec40256c161ce5293eb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Copyright (c) 2008 Silicon Graphics, Inc.  All Rights Reserved.
 */

/*
 * Cross Partition Communication (XPC) uv-based functions.
 *
 *     Architecture specific implementation of common functions.
 *
 */

#include <linux/kernel.h>
#include <asm/uv/uv_hub.h>
#include "../sgi-gru/grukservices.h"
#include "xpc.h"

static DECLARE_BITMAP(xpc_heartbeating_to_mask_uv, XP_MAX_NPARTITIONS_UV);

static void *xpc_activate_mq;

static void
xpc_send_local_activate_IRQ_uv(struct xpc_partition *part)
{
	/*
	 * !!! Make our side think that the remote parition sent an activate
	 * !!! message our way. Also do what the activate IRQ handler would
	 * !!! do had one really been sent.
	 */
}

static enum xp_retval
xpc_rsvd_page_init_uv(struct xpc_rsvd_page *rp)
{
	/* !!! need to have established xpc_activate_mq earlier */
	rp->sn.activate_mq_gpa = uv_gpa(xpc_activate_mq);
	return xpSuccess;
}

static void
xpc_increment_heartbeat_uv(void)
{
	/* !!! send heartbeat msg to xpc_heartbeating_to_mask partids */
}

static void
xpc_heartbeat_init_uv(void)
{
	bitmap_zero(xpc_heartbeating_to_mask_uv, XP_MAX_NPARTITIONS_UV);
	xpc_heartbeating_to_mask = &xpc_heartbeating_to_mask_uv[0];
}

static void
xpc_heartbeat_exit_uv(void)
{
	/* !!! send heartbeat_offline msg to xpc_heartbeating_to_mask partids */
}

static void
xpc_request_partition_activation_uv(struct xpc_rsvd_page *remote_rp,
				    u64 remote_rp_pa, int nasid)
{
	short partid = remote_rp->SAL_partid;
	struct xpc_partition *part = &xpc_partitions[partid];

/*
 * !!! Setup part structure with the bits of info we can glean from the rp:
 * !!!	part->remote_rp_pa = remote_rp_pa;
 * !!!	part->sn.uv.activate_mq_gpa = remote_rp->sn.activate_mq_gpa;
 */

	xpc_send_local_activate_IRQ_uv(part);
}

static void
xpc_request_partition_reactivation_uv(struct xpc_partition *part)
{
	xpc_send_local_activate_IRQ_uv(part);
}

/*
 * Setup the infrastructure necessary to support XPartition Communication
 * between the specified remote partition and the local one.
 */
static enum xp_retval
xpc_setup_infrastructure_uv(struct xpc_partition *part)
{
	/* !!! this function needs fleshing out */
	return xpUnsupported;
}

/*
 * Teardown the infrastructure necessary to support XPartition Communication
 * between the specified remote partition and the local one.
 */
static void
xpc_teardown_infrastructure_uv(struct xpc_partition *part)
{
	/* !!! this function needs fleshing out */
	return;
}

static enum xp_retval
xpc_make_first_contact_uv(struct xpc_partition *part)
{
	/* !!! this function needs fleshing out */
	return xpUnsupported;
}

static u64
xpc_get_chctl_all_flags_uv(struct xpc_partition *part)
{
	/* !!! this function needs fleshing out */
	return 0UL;
}

static struct xpc_msg *
xpc_get_deliverable_msg_uv(struct xpc_channel *ch)
{
	/* !!! this function needs fleshing out */
	return NULL;
}

void
xpc_init_uv(void)
{
	xpc_rsvd_page_init = xpc_rsvd_page_init_uv;
	xpc_increment_heartbeat = xpc_increment_heartbeat_uv;
	xpc_heartbeat_init = xpc_heartbeat_init_uv;
	xpc_heartbeat_exit = xpc_heartbeat_exit_uv;
	xpc_request_partition_activation = xpc_request_partition_activation_uv;
	xpc_request_partition_reactivation =
	    xpc_request_partition_reactivation_uv;
	xpc_setup_infrastructure = xpc_setup_infrastructure_uv;
	xpc_teardown_infrastructure = xpc_teardown_infrastructure_uv;
	xpc_make_first_contact = xpc_make_first_contact_uv;
	xpc_get_chctl_all_flags = xpc_get_chctl_all_flags_uv;
	xpc_get_deliverable_msg = xpc_get_deliverable_msg_uv;
}

void
xpc_exit_uv(void)
{
}