170cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs/* 270cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * Copyright 2012 Red Hat Inc. 370cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * 470cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * Permission is hereby granted, free of charge, to any person obtaining a 570cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * copy of this software and associated documentation files (the "Software"), 670cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * to deal in the Software without restriction, including without limitation 770cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense, 870cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * and/or sell copies of the Software, and to permit persons to whom the 970cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * Software is furnished to do so, subject to the following conditions: 1070cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * 1170cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * The above copyright notice and this permission notice shall be included in 1270cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * all copies or substantial portions of the Software. 1370cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * 1470cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1570cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1670cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1770cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 1870cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 1970cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2070cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * OTHER DEALINGS IN THE SOFTWARE. 2170cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * 2270cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs * Authors: Ben Skeggs 2370cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs */ 2470cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs 2570cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs#include <engine/software.h> 2670cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs#include <engine/disp.h> 2770cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs 28648d4dfde721885737b33a06f2b73ee125acf271Ben Skeggs#include <nvif/class.h> 29370c00f939c5dddd527ab5cfa8740ba7683ac630Ben Skeggs 3070cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs#include "nv50.h" 3170cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs 32a8f8b4891d26c430a18aad6cce561e8d50e85b10Ben Skeggs/******************************************************************************* 33d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs * EVO master channel object 34d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs ******************************************************************************/ 35d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs 36d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggsconst struct nv50_disp_mthd_list 37d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggsnv94_disp_mast_mthd_sor = { 38d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs .mthd = 0x0040, 39d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs .addr = 0x000008, 40d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs .data = { 41d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs { 0x0600, 0x610794 }, 42d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs {} 43d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs } 44d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs}; 45d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs 46d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggsconst struct nv50_disp_mthd_chan 47d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggsnv94_disp_mast_mthd_chan = { 48d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs .name = "Core", 49d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs .addr = 0x000000, 50d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs .data = { 51d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs { "Global", 1, &nv50_disp_mast_mthd_base }, 52d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs { "DAC", 3, &nv84_disp_mast_mthd_dac }, 53d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs { "SOR", 4, &nv94_disp_mast_mthd_sor }, 54d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs { "PIOR", 3, &nv50_disp_mast_mthd_pior }, 55d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs { "HEAD", 2, &nv84_disp_mast_mthd_head }, 56d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs {} 57d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs } 58d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs}; 59d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs 60d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs/******************************************************************************* 61a8f8b4891d26c430a18aad6cce561e8d50e85b10Ben Skeggs * Base display object 62a8f8b4891d26c430a18aad6cce561e8d50e85b10Ben Skeggs ******************************************************************************/ 63a8f8b4891d26c430a18aad6cce561e8d50e85b10Ben Skeggs 6470cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggsstatic struct nouveau_oclass 6570cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggsnv94_disp_sclass[] = { 66648d4dfde721885737b33a06f2b73ee125acf271Ben Skeggs { GT206_DISP_CORE_CHANNEL_DMA, &nv50_disp_mast_ofuncs.base }, 67648d4dfde721885737b33a06f2b73ee125acf271Ben Skeggs { GT200_DISP_BASE_CHANNEL_DMA, &nv50_disp_sync_ofuncs.base }, 68648d4dfde721885737b33a06f2b73ee125acf271Ben Skeggs { GT200_DISP_OVERLAY_CHANNEL_DMA, &nv50_disp_ovly_ofuncs.base }, 69648d4dfde721885737b33a06f2b73ee125acf271Ben Skeggs { G82_DISP_OVERLAY, &nv50_disp_oimm_ofuncs.base }, 70648d4dfde721885737b33a06f2b73ee125acf271Ben Skeggs { G82_DISP_CURSOR, &nv50_disp_curs_ofuncs.base }, 7170cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs {} 7270cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs}; 7370cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs 7470cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggsstatic struct nouveau_oclass 7570cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggsnv94_disp_base_oclass[] = { 76648d4dfde721885737b33a06f2b73ee125acf271Ben Skeggs { GT206_DISP, &nv50_disp_base_ofuncs }, 77370c00f939c5dddd527ab5cfa8740ba7683ac630Ben Skeggs {} 7870cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs}; 7970cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs 80a8f8b4891d26c430a18aad6cce561e8d50e85b10Ben Skeggs/******************************************************************************* 81a8f8b4891d26c430a18aad6cce561e8d50e85b10Ben Skeggs * Display engine implementation 82a8f8b4891d26c430a18aad6cce561e8d50e85b10Ben Skeggs ******************************************************************************/ 83a8f8b4891d26c430a18aad6cce561e8d50e85b10Ben Skeggs 8470cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggsstatic int 8570cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggsnv94_disp_ctor(struct nouveau_object *parent, struct nouveau_object *engine, 8670cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs struct nouveau_oclass *oclass, void *data, u32 size, 8770cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs struct nouveau_object **pobject) 8870cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs{ 8970cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs struct nv50_disp_priv *priv; 9070cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs int ret; 9170cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs 921d7c71a3e2f77336df536855b0efd2dc5bdeb41bBen Skeggs ret = nouveau_disp_create(parent, engine, oclass, 2, "PDISP", 9370cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs "display", &priv); 9470cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs *pobject = nv_object(priv); 9570cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs if (ret) 9670cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs return ret; 9770cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs 98b38a2322df62dbcd423d3e329f401eb14c1f0e4aBen Skeggs ret = nvkm_event_init(&nv50_disp_chan_uevent, 1, 9, &priv->uevent); 99b38a2322df62dbcd423d3e329f401eb14c1f0e4aBen Skeggs if (ret) 100b38a2322df62dbcd423d3e329f401eb14c1f0e4aBen Skeggs return ret; 101b38a2322df62dbcd423d3e329f401eb14c1f0e4aBen Skeggs 10270cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs nv_engine(priv)->sclass = nv94_disp_base_oclass; 10370cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs nv_engine(priv)->cclass = &nv50_disp_cclass; 10470cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs nv_subdev(priv)->intr = nv50_disp_intr; 1055cc027f6b1ec651c18a4322ed3e30c6e9cf01e96Ben Skeggs INIT_WORK(&priv->supervisor, nv50_disp_intr_supervisor); 10670cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs priv->sclass = nv94_disp_sclass; 10770cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs priv->head.nr = 2; 10870cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs priv->dac.nr = 3; 10970cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs priv->sor.nr = 4; 110a2bc283f3905389ba53962a2bbb05ede0c16193dBen Skeggs priv->pior.nr = 3; 111ef22c8bb7b3fac45919b7fde412d36d1a8367d51Ben Skeggs priv->dac.power = nv50_dac_power; 1127ebb38b556485449bfaa506a196439f6a6fd6ebdBen Skeggs priv->dac.sense = nv50_dac_sense; 113ef22c8bb7b3fac45919b7fde412d36d1a8367d51Ben Skeggs priv->sor.power = nv50_sor_power; 1148e9e3d2deacc460fbb8a4691140318f6e85e6891Ben Skeggs priv->sor.hdmi = nv84_hdmi_ctrl; 115a2bc283f3905389ba53962a2bbb05ede0c16193dBen Skeggs priv->pior.power = nv50_pior_power; 11670cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs return 0; 11770cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs} 11870cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs 119a8f8b4891d26c430a18aad6cce561e8d50e85b10Ben Skeggsstruct nouveau_oclass * 120b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggsnv94_disp_outp_sclass[] = { 121b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs &nv50_pior_dp_impl.base.base, 122b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs &nv94_sor_dp_impl.base.base, 123b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs NULL 124b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs}; 125b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs 126b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggsstruct nouveau_oclass * 127a8f8b4891d26c430a18aad6cce561e8d50e85b10Ben Skeggsnv94_disp_oclass = &(struct nv50_disp_impl) { 128a8f8b4891d26c430a18aad6cce561e8d50e85b10Ben Skeggs .base.base.handle = NV_ENGINE(DISP, 0x88), 129a8f8b4891d26c430a18aad6cce561e8d50e85b10Ben Skeggs .base.base.ofuncs = &(struct nouveau_ofuncs) { 13070cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs .ctor = nv94_disp_ctor, 13170cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs .dtor = _nouveau_disp_dtor, 13270cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs .init = _nouveau_disp_init, 13370cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs .fini = _nouveau_disp_fini, 13470cabe4a14ae606a5329abb5489e4ef0d896d03dBen Skeggs }, 13579ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs .base.vblank = &nv50_disp_vblank_func, 136b8407c9e504f43a50ba0de746c5e8958521165aaBen Skeggs .base.outp = nv94_disp_outp_sclass, 137d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs .mthd.core = &nv94_disp_mast_mthd_chan, 138d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs .mthd.base = &nv84_disp_sync_mthd_chan, 139d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs .mthd.ovly = &nv84_disp_ovly_mthd_chan, 140d67d92c0669ef1784edde11448f7881820b22df5Ben Skeggs .mthd.prev = 0x000004, 1414952b4d339033c2019bbd00f28f422b6fc340408Ben Skeggs .head.scanoutpos = nv50_disp_base_scanoutpos, 142a8f8b4891d26c430a18aad6cce561e8d50e85b10Ben Skeggs}.base.base; 143