123c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst/*
223c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * Copyright 2012 Maarten Lankhorst
323c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst *
423c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * Permission is hereby granted, free of charge, to any person obtaining a
523c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * copy of this software and associated documentation files (the "Software"),
623c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * to deal in the Software without restriction, including without limitation
723c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * the rights to use, copy, modify, merge, publish, distribute, sublicense,
823c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * and/or sell copies of the Software, and to permit persons to whom the
923c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * Software is furnished to do so, subject to the following conditions:
1023c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst *
1123c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * The above copyright notice and this permission notice shall be included in
1223c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * all copies or substantial portions of the Software.
1323c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst *
1423c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1523c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1623c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1723c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
1823c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1923c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2023c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * OTHER DEALINGS IN THE SOFTWARE.
2123c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst *
2223c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * Authors: Maarten Lankhorst
2323c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst */
2423c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst
25a0fd4ec8f1ac1d966d33d1a18205b72830f9b24fBen Skeggs#include <engine/falcon.h>
2623c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst#include <engine/bsp.h>
2723c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst
2823c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorststruct nvc0_bsp_priv {
2923c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	struct nouveau_falcon base;
3023c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst};
3123c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst
3223c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst/*******************************************************************************
3323c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * BSP object classes
3423c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst ******************************************************************************/
3523c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst
3623c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorststatic struct nouveau_oclass
3723c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorstnvc0_bsp_sclass[] = {
3823c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	{ 0x90b1, &nouveau_object_ofuncs },
3923c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	{},
4023c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst};
4123c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst
4223c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst/*******************************************************************************
4323c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * PBSP context
4423c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst ******************************************************************************/
4523c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst
4623c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorststatic struct nouveau_oclass
4723c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorstnvc0_bsp_cclass = {
4823c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	.handle = NV_ENGCTX(BSP, 0xc0),
4923c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	.ofuncs = &(struct nouveau_ofuncs) {
5023c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst		.ctor = _nouveau_falcon_context_ctor,
5123c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst		.dtor = _nouveau_falcon_context_dtor,
5223c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst		.init = _nouveau_falcon_context_init,
5323c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst		.fini = _nouveau_falcon_context_fini,
5423c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst		.rd32 = _nouveau_falcon_context_rd32,
5523c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst		.wr32 = _nouveau_falcon_context_wr32,
5623c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	},
5723c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst};
5823c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst
5923c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst/*******************************************************************************
6023c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst * PBSP engine/subdev functions
6123c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst ******************************************************************************/
6223c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst
6323c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorststatic int
6423c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorstnvc0_bsp_init(struct nouveau_object *object)
6523c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst{
6623c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	struct nvc0_bsp_priv *priv = (void *)object;
6723c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	int ret;
6823c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst
6923c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	ret = nouveau_falcon_init(&priv->base);
7023c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	if (ret)
7123c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst		return ret;
7223c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst
7323c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	nv_wr32(priv, 0x084010, 0x0000fff2);
7423c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	nv_wr32(priv, 0x08401c, 0x0000fff2);
7523c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	return 0;
7623c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst}
7723c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst
7823c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorststatic int
7923c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorstnvc0_bsp_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
8023c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	      struct nouveau_oclass *oclass, void *data, u32 size,
8123c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	      struct nouveau_object **pobject)
8223c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst{
8323c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	struct nvc0_bsp_priv *priv;
8423c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	int ret;
8523c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst
8623c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	ret = nouveau_falcon_create(parent, engine, oclass, 0x084000, true,
8723c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst				    "PBSP", "bsp", &priv);
8823c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	*pobject = nv_object(priv);
8923c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	if (ret)
9023c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst		return ret;
9123c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst
9223c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	nv_subdev(priv)->unit = 0x00008000;
939b234db37825860b833ba110673301e2009f0546Maarten Lankhorst	nv_subdev(priv)->intr = nouveau_falcon_intr;
9423c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	nv_engine(priv)->cclass = &nvc0_bsp_cclass;
9523c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	nv_engine(priv)->sclass = nvc0_bsp_sclass;
9623c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	return 0;
9723c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst}
9823c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst
9923c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorststruct nouveau_oclass
10023c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorstnvc0_bsp_oclass = {
10123c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	.handle = NV_ENGINE(BSP, 0xc0),
10223c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	.ofuncs = &(struct nouveau_ofuncs) {
10323c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst		.ctor = nvc0_bsp_ctor,
10423c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst		.dtor = _nouveau_falcon_dtor,
10523c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst		.init = nvc0_bsp_init,
10623c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst		.fini = _nouveau_falcon_fini,
10723c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst		.rd32 = _nouveau_falcon_rd32,
10823c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst		.wr32 = _nouveau_falcon_wr32,
10923c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst	},
11023c14ed2eccc925c2afabcfb7e46b4b45d7fdf70Maarten Lankhorst};
111