1/* 2 * Defines an spu hypervisor abstraction layer. 3 * 4 * Copyright 2006 Sony Corp. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; version 2 of the License. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 */ 19 20#if !defined(_SPU_PRIV1_H) 21#define _SPU_PRIV1_H 22#if defined(__KERNEL__) 23 24#include <linux/types.h> 25 26struct spu; 27 28/* access to priv1 registers */ 29 30struct spu_priv1_ops { 31 void (*int_mask_and) (struct spu *spu, int class, u64 mask); 32 void (*int_mask_or) (struct spu *spu, int class, u64 mask); 33 void (*int_mask_set) (struct spu *spu, int class, u64 mask); 34 u64 (*int_mask_get) (struct spu *spu, int class); 35 void (*int_stat_clear) (struct spu *spu, int class, u64 stat); 36 u64 (*int_stat_get) (struct spu *spu, int class); 37 void (*cpu_affinity_set) (struct spu *spu, int cpu); 38 u64 (*mfc_dar_get) (struct spu *spu); 39 u64 (*mfc_dsisr_get) (struct spu *spu); 40 void (*mfc_dsisr_set) (struct spu *spu, u64 dsisr); 41 void (*mfc_sdr_setup) (struct spu *spu); 42 void (*mfc_sr1_set) (struct spu *spu, u64 sr1); 43 u64 (*mfc_sr1_get) (struct spu *spu); 44 void (*mfc_tclass_id_set) (struct spu *spu, u64 tclass_id); 45 u64 (*mfc_tclass_id_get) (struct spu *spu); 46 void (*tlb_invalidate) (struct spu *spu); 47 void (*resource_allocation_groupID_set) (struct spu *spu, u64 id); 48 u64 (*resource_allocation_groupID_get) (struct spu *spu); 49 void (*resource_allocation_enable_set) (struct spu *spu, u64 enable); 50 u64 (*resource_allocation_enable_get) (struct spu *spu); 51}; 52 53extern const struct spu_priv1_ops* spu_priv1_ops; 54 55static inline void 56spu_int_mask_and (struct spu *spu, int class, u64 mask) 57{ 58 spu_priv1_ops->int_mask_and(spu, class, mask); 59} 60 61static inline void 62spu_int_mask_or (struct spu *spu, int class, u64 mask) 63{ 64 spu_priv1_ops->int_mask_or(spu, class, mask); 65} 66 67static inline void 68spu_int_mask_set (struct spu *spu, int class, u64 mask) 69{ 70 spu_priv1_ops->int_mask_set(spu, class, mask); 71} 72 73static inline u64 74spu_int_mask_get (struct spu *spu, int class) 75{ 76 return spu_priv1_ops->int_mask_get(spu, class); 77} 78 79static inline void 80spu_int_stat_clear (struct spu *spu, int class, u64 stat) 81{ 82 spu_priv1_ops->int_stat_clear(spu, class, stat); 83} 84 85static inline u64 86spu_int_stat_get (struct spu *spu, int class) 87{ 88 return spu_priv1_ops->int_stat_get (spu, class); 89} 90 91static inline void 92spu_cpu_affinity_set (struct spu *spu, int cpu) 93{ 94 spu_priv1_ops->cpu_affinity_set(spu, cpu); 95} 96 97static inline u64 98spu_mfc_dar_get (struct spu *spu) 99{ 100 return spu_priv1_ops->mfc_dar_get(spu); 101} 102 103static inline u64 104spu_mfc_dsisr_get (struct spu *spu) 105{ 106 return spu_priv1_ops->mfc_dsisr_get(spu); 107} 108 109static inline void 110spu_mfc_dsisr_set (struct spu *spu, u64 dsisr) 111{ 112 spu_priv1_ops->mfc_dsisr_set(spu, dsisr); 113} 114 115static inline void 116spu_mfc_sdr_setup (struct spu *spu) 117{ 118 spu_priv1_ops->mfc_sdr_setup(spu); 119} 120 121static inline void 122spu_mfc_sr1_set (struct spu *spu, u64 sr1) 123{ 124 spu_priv1_ops->mfc_sr1_set(spu, sr1); 125} 126 127static inline u64 128spu_mfc_sr1_get (struct spu *spu) 129{ 130 return spu_priv1_ops->mfc_sr1_get(spu); 131} 132 133static inline void 134spu_mfc_tclass_id_set (struct spu *spu, u64 tclass_id) 135{ 136 spu_priv1_ops->mfc_tclass_id_set(spu, tclass_id); 137} 138 139static inline u64 140spu_mfc_tclass_id_get (struct spu *spu) 141{ 142 return spu_priv1_ops->mfc_tclass_id_get(spu); 143} 144 145static inline void 146spu_tlb_invalidate (struct spu *spu) 147{ 148 spu_priv1_ops->tlb_invalidate(spu); 149} 150 151static inline void 152spu_resource_allocation_groupID_set (struct spu *spu, u64 id) 153{ 154 spu_priv1_ops->resource_allocation_groupID_set(spu, id); 155} 156 157static inline u64 158spu_resource_allocation_groupID_get (struct spu *spu) 159{ 160 return spu_priv1_ops->resource_allocation_groupID_get(spu); 161} 162 163static inline void 164spu_resource_allocation_enable_set (struct spu *spu, u64 enable) 165{ 166 spu_priv1_ops->resource_allocation_enable_set(spu, enable); 167} 168 169static inline u64 170spu_resource_allocation_enable_get (struct spu *spu) 171{ 172 return spu_priv1_ops->resource_allocation_enable_get(spu); 173} 174 175/* spu management abstraction */ 176 177struct spu_management_ops { 178 int (*enumerate_spus)(int (*fn)(void *data)); 179 int (*create_spu)(struct spu *spu, void *data); 180 int (*destroy_spu)(struct spu *spu); 181}; 182 183extern const struct spu_management_ops* spu_management_ops; 184 185static inline int 186spu_enumerate_spus (int (*fn)(void *data)) 187{ 188 return spu_management_ops->enumerate_spus(fn); 189} 190 191static inline int 192spu_create_spu (struct spu *spu, void *data) 193{ 194 return spu_management_ops->create_spu(spu, data); 195} 196 197static inline int 198spu_destroy_spu (struct spu *spu) 199{ 200 return spu_management_ops->destroy_spu(spu); 201} 202 203/* 204 * The declarations folowing are put here for convenience 205 * and only intended to be used by the platform setup code. 206 */ 207 208extern const struct spu_priv1_ops spu_priv1_mmio_ops; 209extern const struct spu_priv1_ops spu_priv1_beat_ops; 210 211extern const struct spu_management_ops spu_management_of_ops; 212 213#endif /* __KERNEL__ */ 214#endif 215