10d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin/*
20d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin * Copyright 2012 Red Hat Inc.
30d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin *
40d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin * Permission is hereby granted, free of charge, to any person obtaining a
50d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin * copy of this software and associated documentation files (the "Software"),
60d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin * to deal in the Software without restriction, including without limitation
70d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin * the rights to use, copy, modify, merge, publish, distribute, sublicense,
80d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin * and/or sell copies of the Software, and to permit persons to whom the
90d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin * Software is furnished to do so, subject to the following conditions:
100d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin *
110d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin * The above copyright notice and this permission notice shall be included in
120d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin * all copies or substantial portions of the Software.
130d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin *
140d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
150d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
160d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
170d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
180d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
190d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
200d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin * OTHER DEALINGS IN THE SOFTWARE.
210d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin *
22ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin * Authors: Ben Skeggs, Maarten Lankhorst, Ilia Mirkin
230d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin */
240d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin
25ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin#include <engine/falcon.h>
260d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin#include <engine/bsp.h>
270d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin
280d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkinstruct nv98_bsp_priv {
29ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin	struct nouveau_falcon base;
300d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin};
310d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin
320d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin/*******************************************************************************
330d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin * BSP object classes
340d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin ******************************************************************************/
350d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin
360d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkinstatic struct nouveau_oclass
370d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkinnv98_bsp_sclass[] = {
38ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin	{ 0x88b1, &nouveau_object_ofuncs },
39ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin	{ 0x85b1, &nouveau_object_ofuncs },
40ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin	{ 0x86b1, &nouveau_object_ofuncs },
410d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin	{},
420d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin};
430d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin
440d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin/*******************************************************************************
45ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin * PBSP context
460d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin ******************************************************************************/
470d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin
480d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkinstatic struct nouveau_oclass
490d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkinnv98_bsp_cclass = {
500d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin	.handle = NV_ENGCTX(BSP, 0x98),
510d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin	.ofuncs = &(struct nouveau_ofuncs) {
52ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin		.ctor = _nouveau_falcon_context_ctor,
53ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin		.dtor = _nouveau_falcon_context_dtor,
54ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin		.init = _nouveau_falcon_context_init,
55ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin		.fini = _nouveau_falcon_context_fini,
56ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin		.rd32 = _nouveau_falcon_context_rd32,
57ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin		.wr32 = _nouveau_falcon_context_wr32,
580d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin	},
590d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin};
600d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin
610d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin/*******************************************************************************
62ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin * PBSP engine/subdev functions
630d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin ******************************************************************************/
640d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin
650d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkinstatic int
66ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkinnv98_bsp_init(struct nouveau_object *object)
67ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin{
68ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin	struct nv98_bsp_priv *priv = (void *)object;
69ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin	int ret;
70ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin
71ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin	ret = nouveau_falcon_init(&priv->base);
72ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin	if (ret)
73ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin		return ret;
74ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin
75ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin	nv_wr32(priv, 0x084010, 0x0000ffd2);
76ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin	nv_wr32(priv, 0x08401c, 0x0000fff2);
77ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin	return 0;
78ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin}
79ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin
80ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkinstatic int
810d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkinnv98_bsp_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
820d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin	      struct nouveau_oclass *oclass, void *data, u32 size,
830d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin	      struct nouveau_object **pobject)
840d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin{
850d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin	struct nv98_bsp_priv *priv;
860d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin	int ret;
870d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin
88ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin	ret = nouveau_falcon_create(parent, engine, oclass, 0x084000, true,
890d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin				    "PBSP", "bsp", &priv);
900d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin	*pobject = nv_object(priv);
910d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin	if (ret)
920d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin		return ret;
930d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin
940d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin	nv_subdev(priv)->unit = 0x04008000;
950d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin	nv_engine(priv)->cclass = &nv98_bsp_cclass;
960d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin	nv_engine(priv)->sclass = nv98_bsp_sclass;
970d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin	return 0;
980d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin}
990d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin
1000d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkinstruct nouveau_oclass
1010d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkinnv98_bsp_oclass = {
1020d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin	.handle = NV_ENGINE(BSP, 0x98),
1030d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin	.ofuncs = &(struct nouveau_ofuncs) {
1040d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin		.ctor = nv98_bsp_ctor,
105ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin		.dtor = _nouveau_falcon_dtor,
106ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin		.init = nv98_bsp_init,
107ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin		.fini = _nouveau_falcon_fini,
108ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin		.rd32 = _nouveau_falcon_rd32,
109ef7d64e5c27bc2587b4a20c9ae04413ce679bd8cIlia Mirkin		.wr32 = _nouveau_falcon_wr32,
1100d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin	},
1110d4a1450c95801c21ba4db109303fbad62378b91Ilia Mirkin};
112