@@ -34,6 +34,7 @@ nouveau_engine_create_(struct nouveau_object *parent,
int length, void **pobject)
{
struct nouveau_engine *engine;
+ struct nouveau_device *device;
int ret;
ret = nouveau_subdev_create_(parent, engobj, oclass, NV_ENGINE_CLASS,
@@ -42,11 +43,21 @@ nouveau_engine_create_(struct nouveau_object *parent,
if (ret)
return ret;
- if ( parent &&
- !nouveau_boolopt(nv_device(parent)->cfgopt, iname, enable)) {
- if (!enable)
- nv_warn(engine, "disabled, %s=1 to enable\n", iname);
- return -ENODEV;
+ if (parent) {
+ device = nv_device(parent);
+ if (device->disable_mask & (1ULL << (oclass->handle & 0xff))) {
+ if (nouveau_boolopt(device->cfgopt, iname, false)) {
+ nv_warn(engine, "hardware is marked as disabled, but obeying explicit enable\n");
+ } else {
+ nv_info(engine, "hardware is marked as disabled\n");
+ return -ENODEV;
+ }
+ }
+ if (!nouveau_boolopt(device->cfgopt, iname, enable)) {
+ if (!enable)
+ nv_warn(engine, "disabled, %s=1 to enable\n", iname);
+ return -ENODEV;
+ }
}
INIT_LIST_HEAD(&engine->contexts);
@@ -70,6 +70,7 @@ struct nouveau_device {
const char *dbgopt;
const char *name;
const char *cname;
+ u64 disable_mask;
enum {
NV_04 = 0x04,
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> --- I decided to let the user still specify config=BLA=1 to override the hw disable in case we get something wrong or for double-checking stuff, but I suspect it won't really be used much. I'm not terribly fond of the message text, if you come up with something better, feel free to drop it in. drivers/gpu/drm/nouveau/core/core/engine.c | 21 ++++++++++++++++----- drivers/gpu/drm/nouveau/core/include/core/device.h | 1 + 2 files changed, 17 insertions(+), 5 deletions(-)