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