1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#ifndef _SYS_MPO_H
28#define	_SYS_MPO_H
29
30#ifdef __cplusplus
31extern "C" {
32#endif
33
34#include <sys/lgrp.h>
35
36/*
37 * mpo.h -  Sun4v MPO common header file
38 *
39 */
40
41#define	PROP_LG_CPU_ID	"id"
42#define	PROP_LG_MASK	"address-mask"
43#define	PROP_LG_LATENCY "latency"
44#define	PROP_LG_MATCH	"address-match"
45#define	PROP_LG_MEM_LG	"memory-latency-group"
46#define	PROP_LG_CPU	"cpu"
47#define	PROP_LG_MBLOCK	"mblock"
48#define	PROP_LG_BASE	"base"
49#define	PROP_LG_SIZE	"size"
50#define	PROP_LG_RA_PA_OFFSET	"address-congruence-offset"
51
52/* Macro to set the correspending bit if an mem-lg homeid is a member */
53#define	HOMESET_ADD(homeset, home)\
54	homeset |= ((int)1 << (home))
55
56/* Macro to check if an mem_lg homeid is a member of the homeset */
57#define	MEM_LG_ISMEMBER(homeset, home)\
58	((homeset) & ((uint64_t)1 << (home)))
59
60/* Structure to store CPU information from the MD */
61
62struct cpu_md {
63	uint_t 	home;
64	int	lgrp_index;
65};
66
67/* Structure to store mem-lg information from the MD */
68
69struct lgrp_md {
70	uint64_t	id;
71	uint64_t	addr_mask;
72	uint64_t	addr_match;
73	uint64_t	latency;
74	mde_cookie_t	node;
75	int		ncpu;
76};
77
78/* Structure to store mblock information retrieved from the MD */
79
80typedef struct mblock_md {
81	uint64_t	base;
82	uint64_t	size;
83	uint64_t	ra_to_pa;
84	pfn_t		base_pfn;
85	pfn_t		end_pfn;
86} mblock_md_t;
87
88/* Structure for memnode information for use by plat_pfn_to_mem_node */
89
90struct mnode_info {
91	pfn_t		base_pfn;
92	pfn_t		end_pfn;
93};
94
95/* A stripe defines the portion of a mem_node that falls in one mblock */
96typedef struct {
97	pfn_t physbase;	/* first page in mnode in the corresponding mblock */
98	pfn_t physmax;	/* last valid page in mnode in mblock */
99	pfn_t offset;   /* stripe starts at physbase - offset */
100	int exists;	/* set to 1 if mblock has memory in this mnode stripe */
101} mem_stripe_t;
102
103/* Configuration including allocation state of mblocks and stripes */
104
105typedef struct {
106	mblock_md_t	*mc_mblocks;	/* mblock array */
107	int 		mc_nmblocks;	/* number in array */
108	mem_stripe_t 	*mc_stripes;	/* stripe array */
109	int 		mc_nstripes;	/* number in array */
110	int 		mc_alloc_sz;	/* size in bytes of mc_mblocks if */
111					/* it was kmem_alloc'd, else 0 */
112} mpo_config_t;
113
114/* These are used when MPO requires preallocated kvseg32 space */
115extern	caddr_t	mpo_heap32_buf;
116extern	size_t	mpo_heap32_bufsz;
117extern void mpo_cpu_add(md_t *md, int cpuid);
118extern void mpo_cpu_remove(int cpuid);
119
120#ifdef	__cplusplus
121}
122#endif
123
124#endif /* _SYS_MPO_H */
125