15025407bSBen Skeggs #ifndef __NVKM_ENGINE_H__ 25025407bSBen Skeggs #define __NVKM_ENGINE_H__ 3c39f472eSBen Skeggs #include <core/subdev.h> 4168c2e21SBen Skeggs struct nvkm_device_oclass; /*XXX: DEV!ENG */ 5168c2e21SBen Skeggs struct nvkm_fifo_chan; 6c39f472eSBen Skeggs 7493f189dSBen Skeggs #define NV_ENGINE_(eng,var) (((var) << 8) | (eng)) 8c39f472eSBen Skeggs #define NV_ENGINE(name,var) NV_ENGINE_(NVDEV_ENGINE_##name, (var)) 9c39f472eSBen Skeggs 105025407bSBen Skeggs struct nvkm_engine { 115025407bSBen Skeggs struct nvkm_subdev subdev; 12168c2e21SBen Skeggs const struct nvkm_engine_func *func; 13168c2e21SBen Skeggs 14168c2e21SBen Skeggs int usecount; 15168c2e21SBen Skeggs 165025407bSBen Skeggs struct nvkm_oclass *cclass; 175025407bSBen Skeggs struct nvkm_oclass *sclass; 18c39f472eSBen Skeggs 19c39f472eSBen Skeggs struct list_head contexts; 20c39f472eSBen Skeggs spinlock_t lock; 21c39f472eSBen Skeggs 225025407bSBen Skeggs void (*tile_prog)(struct nvkm_engine *, int region); 235025407bSBen Skeggs int (*tlb_flush)(struct nvkm_engine *); 24c39f472eSBen Skeggs }; 25c39f472eSBen Skeggs 26168c2e21SBen Skeggs struct nvkm_engine_func { 27168c2e21SBen Skeggs void *(*dtor)(struct nvkm_engine *); 28168c2e21SBen Skeggs int (*oneinit)(struct nvkm_engine *); 29168c2e21SBen Skeggs int (*init)(struct nvkm_engine *); 30168c2e21SBen Skeggs int (*fini)(struct nvkm_engine *, bool suspend); 31168c2e21SBen Skeggs void (*intr)(struct nvkm_engine *); 32168c2e21SBen Skeggs 33168c2e21SBen Skeggs struct { 34168c2e21SBen Skeggs int (*sclass)(struct nvkm_oclass *, int index, 35168c2e21SBen Skeggs const struct nvkm_device_oclass **); 36168c2e21SBen Skeggs } base; 37168c2e21SBen Skeggs 38168c2e21SBen Skeggs struct { 39168c2e21SBen Skeggs int (*cclass)(struct nvkm_fifo_chan *, 40168c2e21SBen Skeggs const struct nvkm_oclass *, 41168c2e21SBen Skeggs struct nvkm_object **); 42168c2e21SBen Skeggs int (*sclass)(struct nvkm_oclass *, int index); 43168c2e21SBen Skeggs } fifo; 44168c2e21SBen Skeggs 45168c2e21SBen Skeggs struct nvkm_sclass sclass[]; 46168c2e21SBen Skeggs }; 47168c2e21SBen Skeggs 48168c2e21SBen Skeggs int nvkm_engine_ctor(const struct nvkm_engine_func *, struct nvkm_device *, 49168c2e21SBen Skeggs int index, u32 pmc_enable, bool enable, 50168c2e21SBen Skeggs struct nvkm_engine *); 51168c2e21SBen Skeggs int nvkm_engine_new_(const struct nvkm_engine_func *, struct nvkm_device *, 52168c2e21SBen Skeggs int index, u32 pmc_enable, bool enable, 53168c2e21SBen Skeggs struct nvkm_engine **); 54168c2e21SBen Skeggs struct nvkm_engine *nvkm_engine_ref(struct nvkm_engine *); 55168c2e21SBen Skeggs void nvkm_engine_unref(struct nvkm_engine **); 56168c2e21SBen Skeggs 575025407bSBen Skeggs static inline struct nvkm_engine * 58c39f472eSBen Skeggs nv_engine(void *obj) 59c39f472eSBen Skeggs { 60c39f472eSBen Skeggs #if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA 6153003941SBen Skeggs BUG_ON(!nv_iclass(obj, NV_ENGINE_CLASS)); 62c39f472eSBen Skeggs #endif 63c39f472eSBen Skeggs return obj; 64c39f472eSBen Skeggs } 65c39f472eSBen Skeggs 66c39f472eSBen Skeggs static inline int 675025407bSBen Skeggs nv_engidx(struct nvkm_engine *engine) 68c39f472eSBen Skeggs { 69c39f472eSBen Skeggs return nv_subidx(&engine->subdev); 70c39f472eSBen Skeggs } 71c39f472eSBen Skeggs 725025407bSBen Skeggs struct nvkm_engine *nvkm_engine(void *obj, int idx); 73c39f472eSBen Skeggs 745025407bSBen Skeggs #define nvkm_engine_create(p,e,c,d,i,f,r) \ 755025407bSBen Skeggs nvkm_engine_create_((p), (e), (c), (d), (i), (f), \ 76c39f472eSBen Skeggs sizeof(**r),(void **)r) 77c39f472eSBen Skeggs 785025407bSBen Skeggs #define nvkm_engine_destroy(p) \ 795025407bSBen Skeggs nvkm_subdev_destroy(&(p)->subdev) 8089c651e2SBen Skeggs #define nvkm_engine_init_old(p) \ 813a8c3400SBen Skeggs nvkm_subdev_init_old(&(p)->subdev) 8289c651e2SBen Skeggs #define nvkm_engine_fini_old(p,s) \ 833a8c3400SBen Skeggs nvkm_subdev_fini_old(&(p)->subdev, (s)) 84c39f472eSBen Skeggs 855025407bSBen Skeggs int nvkm_engine_create_(struct nvkm_object *, struct nvkm_object *, 865025407bSBen Skeggs struct nvkm_oclass *, bool, const char *, 87c39f472eSBen Skeggs const char *, int, void **); 88c39f472eSBen Skeggs 895025407bSBen Skeggs #define _nvkm_engine_dtor _nvkm_subdev_dtor 905025407bSBen Skeggs #define _nvkm_engine_init _nvkm_subdev_init 915025407bSBen Skeggs #define _nvkm_engine_fini _nvkm_subdev_fini 929ace404bSBen Skeggs 939ace404bSBen Skeggs #include <core/device.h> 94c39f472eSBen Skeggs #endif 95