+
+void
+gm200_sor_magic(struct nvkm_output *outp)
+{
+ struct nvkm_device *device = outp->disp->engine.subdev.device;
+ const u32 soff = outp->or * 0x100;
+ const u32 data = outp->or + 1;
+ if (outp->info.sorconf.link & 1)
+ nvkm_mask(device, 0x612308 + soff, 0x0000001f, 0x00000000 | data);
+ if (outp->info.sorconf.link & 2)
+ nvkm_mask(device, 0x612388 + soff, 0x0000001f, 0x00000010 | data);
+}
+
+static const struct nvkm_ior_func
+gm200_sor = {
+ .state = gf119_sor_state,
+ .power = nv50_sor_power,
+ .hdmi = {
+ .ctrl = gk104_hdmi_ctrl,
+ },
+ .dp = {
+ .lanes = { 0, 1, 2, 3 },
+ .links = gf119_sor_dp_links,
+ .power = g94_sor_dp_power,
+ .pattern = gm107_sor_dp_pattern,
+ },
+};
+
+int
+gm200_sor_new(struct nvkm_disp *disp, int id)
+{
+ return nvkm_ior_new_(&gm200_sor, disp, SOR, id);
+}