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 458f0649b5SBen Skeggs const struct nvkm_object_func *cclass; 46168c2e21SBen Skeggs struct nvkm_sclass sclass[]; 47168c2e21SBen Skeggs }; 48168c2e21SBen Skeggs 49168c2e21SBen Skeggs int nvkm_engine_ctor(const struct nvkm_engine_func *, struct nvkm_device *, 50168c2e21SBen Skeggs int index, u32 pmc_enable, bool enable, 51168c2e21SBen Skeggs struct nvkm_engine *); 52168c2e21SBen Skeggs int nvkm_engine_new_(const struct nvkm_engine_func *, struct nvkm_device *, 53168c2e21SBen Skeggs int index, u32 pmc_enable, bool enable, 54168c2e21SBen Skeggs struct nvkm_engine **); 55168c2e21SBen Skeggs struct nvkm_engine *nvkm_engine_ref(struct nvkm_engine *); 56168c2e21SBen Skeggs void nvkm_engine_unref(struct nvkm_engine **); 57168c2e21SBen Skeggs 585025407bSBen Skeggs static inline struct nvkm_engine * 59c39f472eSBen Skeggs nv_engine(void *obj) 60c39f472eSBen Skeggs { 61c39f472eSBen Skeggs #if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA 6253003941SBen Skeggs BUG_ON(!nv_iclass(obj, NV_ENGINE_CLASS)); 63c39f472eSBen Skeggs #endif 64c39f472eSBen Skeggs return obj; 65c39f472eSBen Skeggs } 66c39f472eSBen Skeggs 67c39f472eSBen Skeggs static inline int 685025407bSBen Skeggs nv_engidx(struct nvkm_engine *engine) 69c39f472eSBen Skeggs { 70c39f472eSBen Skeggs return nv_subidx(&engine->subdev); 71c39f472eSBen Skeggs } 72c39f472eSBen Skeggs 735025407bSBen Skeggs struct nvkm_engine *nvkm_engine(void *obj, int idx); 74c39f472eSBen Skeggs 755025407bSBen Skeggs #define nvkm_engine_create(p,e,c,d,i,f,r) \ 765025407bSBen Skeggs nvkm_engine_create_((p), (e), (c), (d), (i), (f), \ 77c39f472eSBen Skeggs sizeof(**r),(void **)r) 78c39f472eSBen Skeggs 795025407bSBen Skeggs #define nvkm_engine_destroy(p) \ 805025407bSBen Skeggs nvkm_subdev_destroy(&(p)->subdev) 8189c651e2SBen Skeggs #define nvkm_engine_init_old(p) \ 823a8c3400SBen Skeggs nvkm_subdev_init_old(&(p)->subdev) 8389c651e2SBen Skeggs #define nvkm_engine_fini_old(p,s) \ 843a8c3400SBen Skeggs nvkm_subdev_fini_old(&(p)->subdev, (s)) 85c39f472eSBen Skeggs 865025407bSBen Skeggs int nvkm_engine_create_(struct nvkm_object *, struct nvkm_object *, 875025407bSBen Skeggs struct nvkm_oclass *, bool, const char *, 88c39f472eSBen Skeggs const char *, int, void **); 89c39f472eSBen Skeggs 905025407bSBen Skeggs #define _nvkm_engine_dtor _nvkm_subdev_dtor 915025407bSBen Skeggs #define _nvkm_engine_init _nvkm_subdev_init 925025407bSBen Skeggs #define _nvkm_engine_fini _nvkm_subdev_fini 939ace404bSBen Skeggs 949ace404bSBen Skeggs #include <core/device.h> 95c39f472eSBen Skeggs #endif 96