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