#define nvif_mthd(a,b,c,d) nvif_object_mthd((a), (b), (c), (d))
 
+struct nvif_mclass {
+       s32 oclass;
+       int version;
+};
+
+#define nvif_mclass(o,m) ({                                                    \
+       struct nvif_object *object = (o);                                      \
+       struct nvif_sclass *sclass;                                            \
+       const typeof(m[0]) *mclass = (m);                                      \
+       int ret = -ENODEV;                                                     \
+       int cnt, i, j;                                                         \
+                                                                               \
+       cnt = nvif_object_sclass_get(object, &sclass);                         \
+       if (cnt >= 0) {                                                        \
+               for (i = 0; ret < 0 && mclass[i].oclass; i++) {                \
+                       for (j = 0; j < cnt; j++) {                            \
+                               if (mclass[i].oclass  == sclass[j].oclass &&   \
+                                   mclass[i].version >= sclass[j].minver &&   \
+                                   mclass[i].version <= sclass[j].maxver) {   \
+                                       ret = i;                               \
+                                       break;                                 \
+                               }                                              \
+                       }                                                      \
+               }                                                              \
+               nvif_object_sclass_put(&sclass);                               \
+       }                                                                      \
+       ret;                                                                   \
+})
+
 /*XXX*/
 #include <core/object.h>
 #define nvxx_object(a) ({                                                      \