drm/nouveau/disp/gm200-: detect and potentially disable HDA support on some SORs
[linux-2.6-microblaze.git] / drivers / gpu / drm / nouveau / nvkm / engine / disp / sorgp100.c
index 94feb91..c54f883 100644 (file)
@@ -22,7 +22,7 @@
 #include "ior.h"
 
 static const struct nvkm_ior_func
-gp100_sor = {
+gp100_sor_hda = {
        .route = {
                .get = gm200_sor_route_get,
                .set = gm200_sor_route_set,
@@ -52,8 +52,42 @@ gp100_sor = {
        },
 };
 
+static const struct nvkm_ior_func
+gp100_sor = {
+       .route = {
+               .get = gm200_sor_route_get,
+               .set = gm200_sor_route_set,
+       },
+       .state = gf119_sor_state,
+       .power = nv50_sor_power,
+       .clock = gf119_sor_clock,
+       .hdmi = {
+               .ctrl = gk104_hdmi_ctrl,
+               .scdc = gm200_hdmi_scdc,
+       },
+       .dp = {
+               .lanes = { 0, 1, 2, 3 },
+               .links = gf119_sor_dp_links,
+               .power = g94_sor_dp_power,
+               .pattern = gm107_sor_dp_pattern,
+               .drive = gm200_sor_dp_drive,
+               .vcpi = gf119_sor_dp_vcpi,
+               .audio = gf119_sor_dp_audio,
+               .audio_sym = gf119_sor_dp_audio_sym,
+               .watermark = gf119_sor_dp_watermark,
+       },
+};
+
 int
 gp100_sor_new(struct nvkm_disp *disp, int id)
 {
+       struct nvkm_device *device = disp->engine.subdev.device;
+       u32 hda;
+
+       if (!((hda = nvkm_rd32(device, 0x08a15c)) & 0x40000000))
+               hda = nvkm_rd32(device, 0x10ebb0) >> 8;
+
+       if (hda & BIT(id))
+               return nvkm_ior_new_(&gp100_sor_hda, disp, SOR, id);
        return nvkm_ior_new_(&gp100_sor, disp, SOR, id);
 }