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 31 extern "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 62 struct cpu_md { 63 uint_t home; 64 int lgrp_index; 65 }; 66 67 /* Structure to store mem-lg information from the MD */ 68 69 struct 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 80 typedef 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 90 struct 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 */ 96 typedef 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 105 typedef 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 */ 115 extern caddr_t mpo_heap32_buf; 116 extern size_t mpo_heap32_bufsz; 117 extern void mpo_cpu_add(md_t *md, int cpuid); 118 extern void mpo_cpu_remove(int cpuid); 119 120 #ifdef __cplusplus 121 } 122 #endif 123 124 #endif /* _SYS_MPO_H */ 125