Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Defines an spu hypervisor abstraction layer.
0004  *
0005  *  Copyright 2006 Sony Corp.
0006  */
0007 
0008 #if !defined(_SPU_PRIV1_H)
0009 #define _SPU_PRIV1_H
0010 #if defined(__KERNEL__)
0011 
0012 #include <linux/types.h>
0013 
0014 struct spu;
0015 struct spu_context;
0016 
0017 /* access to priv1 registers */
0018 
0019 struct spu_priv1_ops {
0020     void (*int_mask_and) (struct spu *spu, int class, u64 mask);
0021     void (*int_mask_or) (struct spu *spu, int class, u64 mask);
0022     void (*int_mask_set) (struct spu *spu, int class, u64 mask);
0023     u64 (*int_mask_get) (struct spu *spu, int class);
0024     void (*int_stat_clear) (struct spu *spu, int class, u64 stat);
0025     u64 (*int_stat_get) (struct spu *spu, int class);
0026     void (*cpu_affinity_set) (struct spu *spu, int cpu);
0027     u64 (*mfc_dar_get) (struct spu *spu);
0028     u64 (*mfc_dsisr_get) (struct spu *spu);
0029     void (*mfc_dsisr_set) (struct spu *spu, u64 dsisr);
0030     void (*mfc_sdr_setup) (struct spu *spu);
0031     void (*mfc_sr1_set) (struct spu *spu, u64 sr1);
0032     u64 (*mfc_sr1_get) (struct spu *spu);
0033     void (*mfc_tclass_id_set) (struct spu *spu, u64 tclass_id);
0034     u64 (*mfc_tclass_id_get) (struct spu *spu);
0035     void (*tlb_invalidate) (struct spu *spu);
0036     void (*resource_allocation_groupID_set) (struct spu *spu, u64 id);
0037     u64 (*resource_allocation_groupID_get) (struct spu *spu);
0038     void (*resource_allocation_enable_set) (struct spu *spu, u64 enable);
0039     u64 (*resource_allocation_enable_get) (struct spu *spu);
0040 };
0041 
0042 extern const struct spu_priv1_ops* spu_priv1_ops;
0043 
0044 static inline void
0045 spu_int_mask_and (struct spu *spu, int class, u64 mask)
0046 {
0047     spu_priv1_ops->int_mask_and(spu, class, mask);
0048 }
0049 
0050 static inline void
0051 spu_int_mask_or (struct spu *spu, int class, u64 mask)
0052 {
0053     spu_priv1_ops->int_mask_or(spu, class, mask);
0054 }
0055 
0056 static inline void
0057 spu_int_mask_set (struct spu *spu, int class, u64 mask)
0058 {
0059     spu_priv1_ops->int_mask_set(spu, class, mask);
0060 }
0061 
0062 static inline u64
0063 spu_int_mask_get (struct spu *spu, int class)
0064 {
0065     return spu_priv1_ops->int_mask_get(spu, class);
0066 }
0067 
0068 static inline void
0069 spu_int_stat_clear (struct spu *spu, int class, u64 stat)
0070 {
0071     spu_priv1_ops->int_stat_clear(spu, class, stat);
0072 }
0073 
0074 static inline u64
0075 spu_int_stat_get (struct spu *spu, int class)
0076 {
0077     return spu_priv1_ops->int_stat_get (spu, class);
0078 }
0079 
0080 static inline void
0081 spu_cpu_affinity_set (struct spu *spu, int cpu)
0082 {
0083     spu_priv1_ops->cpu_affinity_set(spu, cpu);
0084 }
0085 
0086 static inline u64
0087 spu_mfc_dar_get (struct spu *spu)
0088 {
0089     return spu_priv1_ops->mfc_dar_get(spu);
0090 }
0091 
0092 static inline u64
0093 spu_mfc_dsisr_get (struct spu *spu)
0094 {
0095     return spu_priv1_ops->mfc_dsisr_get(spu);
0096 }
0097 
0098 static inline void
0099 spu_mfc_dsisr_set (struct spu *spu, u64 dsisr)
0100 {
0101     spu_priv1_ops->mfc_dsisr_set(spu, dsisr);
0102 }
0103 
0104 static inline void
0105 spu_mfc_sdr_setup (struct spu *spu)
0106 {
0107     spu_priv1_ops->mfc_sdr_setup(spu);
0108 }
0109 
0110 static inline void
0111 spu_mfc_sr1_set (struct spu *spu, u64 sr1)
0112 {
0113     spu_priv1_ops->mfc_sr1_set(spu, sr1);
0114 }
0115 
0116 static inline u64
0117 spu_mfc_sr1_get (struct spu *spu)
0118 {
0119     return spu_priv1_ops->mfc_sr1_get(spu);
0120 }
0121 
0122 static inline void
0123 spu_mfc_tclass_id_set (struct spu *spu, u64 tclass_id)
0124 {
0125     spu_priv1_ops->mfc_tclass_id_set(spu, tclass_id);
0126 }
0127 
0128 static inline u64
0129 spu_mfc_tclass_id_get (struct spu *spu)
0130 {
0131     return spu_priv1_ops->mfc_tclass_id_get(spu);
0132 }
0133 
0134 static inline void
0135 spu_tlb_invalidate (struct spu *spu)
0136 {
0137     spu_priv1_ops->tlb_invalidate(spu);
0138 }
0139 
0140 static inline void
0141 spu_resource_allocation_groupID_set (struct spu *spu, u64 id)
0142 {
0143     spu_priv1_ops->resource_allocation_groupID_set(spu, id);
0144 }
0145 
0146 static inline u64
0147 spu_resource_allocation_groupID_get (struct spu *spu)
0148 {
0149     return spu_priv1_ops->resource_allocation_groupID_get(spu);
0150 }
0151 
0152 static inline void
0153 spu_resource_allocation_enable_set (struct spu *spu, u64 enable)
0154 {
0155     spu_priv1_ops->resource_allocation_enable_set(spu, enable);
0156 }
0157 
0158 static inline u64
0159 spu_resource_allocation_enable_get (struct spu *spu)
0160 {
0161     return spu_priv1_ops->resource_allocation_enable_get(spu);
0162 }
0163 
0164 /* spu management abstraction */
0165 
0166 struct spu_management_ops {
0167     int (*enumerate_spus)(int (*fn)(void *data));
0168     int (*create_spu)(struct spu *spu, void *data);
0169     int (*destroy_spu)(struct spu *spu);
0170     void (*enable_spu)(struct spu_context *ctx);
0171     void (*disable_spu)(struct spu_context *ctx);
0172     int (*init_affinity)(void);
0173 };
0174 
0175 extern const struct spu_management_ops* spu_management_ops;
0176 
0177 static inline int
0178 spu_enumerate_spus (int (*fn)(void *data))
0179 {
0180     return spu_management_ops->enumerate_spus(fn);
0181 }
0182 
0183 static inline int
0184 spu_create_spu (struct spu *spu, void *data)
0185 {
0186     return spu_management_ops->create_spu(spu, data);
0187 }
0188 
0189 static inline int
0190 spu_destroy_spu (struct spu *spu)
0191 {
0192     return spu_management_ops->destroy_spu(spu);
0193 }
0194 
0195 static inline int
0196 spu_init_affinity (void)
0197 {
0198     return spu_management_ops->init_affinity();
0199 }
0200 
0201 static inline void
0202 spu_enable_spu (struct spu_context *ctx)
0203 {
0204     spu_management_ops->enable_spu(ctx);
0205 }
0206 
0207 static inline void
0208 spu_disable_spu (struct spu_context *ctx)
0209 {
0210     spu_management_ops->disable_spu(ctx);
0211 }
0212 
0213 /*
0214  * The declarations following are put here for convenience
0215  * and only intended to be used by the platform setup code.
0216  */
0217 
0218 extern const struct spu_priv1_ops spu_priv1_mmio_ops;
0219 extern const struct spu_priv1_ops spu_priv1_beat_ops;
0220 
0221 extern const struct spu_management_ops spu_management_of_ops;
0222 
0223 #endif /* __KERNEL__ */
0224 #endif