// ========== Copyright Header Begin ========================================== // // OpenSPARC T2 Processor File: niu_int_sidmgr.vr // Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved // 4150 Network Circle, Santa Clara, California 95054, U.S.A. // // * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; version 2 of the License. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // For the avoidance of doubt, and except that if any non-GPL license // choice is available it will apply instead, Sun elects to use only // the General Public License version 2 (GPLv2) at this time for any // software where a choice of GPL license versions is made // available with the language indicating that GPLv2 or any later version // may be used, or where a choice of which version of the GPL is applied is // otherwise unspecified. // // Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, // CA 95054 USA or visit www.sun.com if you need additional information or // have any questions. // // ========== Copyright Header End ============================================ #include #include "pio_memory_map.vri" #include "pio_driver.vrh" extern niu_gen_pio gen_pio_drv; class CSidShadowTab { bit [63:0] valid; local integer ShTab[]; task new(); function integer deleteSidTab(integer gid, bit [6:0] data) ; function integer updateSidTab(integer gid, bit [6:0] data) ; task pio_writeSidTab(integer gid, bit [6:0] data) ; task pio_readSidTab(integer gid, var bit [6:0] data) ; task RemoveSidTab(integer gid) ; function integer getGid(var integer gid, bit [6:0] data); } task CSidShadowTab::new() { valid = 0; } task CSidShadowTab::RemoveSidTab(integer gid) { bit [6:0] data; bit[63:0] address,wdata; integer status; pio_readSidTab(gid,data); status = deleteSidTab(gid,data); address = NIU_SID + 8*gid; wdata = 64'h0; gen_pio_drv.pio_wr(address,wdata); } function integer CSidShadowTab::deleteSidTab(integer gid, bit [6:0] data) { integer status; if(assoc_index(CHECK,ShTab,data)) { status = assoc_index(DELETE,ShTab,data); deleteSidTab = 1; valid[gid]=0; } else { deleteSidTab = 0; } } function integer CSidShadowTab::updateSidTab(integer gid, bit [6:0] data) { if(assoc_index(CHECK,ShTab,data)) { printf(" SID - %x Already exists in the tables !! Skipping the update \n"); updateSidTab = -1; } else { ShTab[data] = gid; updateSidTab = 1; } } task CSidShadowTab::pio_writeSidTab(integer gid, bit [6:0] data) { integer status; bit [63:0] address; bit[63:0] wdata; status = updateSidTab(gid,data); if(status !=-1) { address = NIU_SID + 8*gid; wdata = { 57'h0,data}; gen_pio_drv.pio_wr(address,wdata); valid [gid] = 1; } else { printf("CSidShadowTab::pio_writeSidTab TB ERROR \n"); } } task CSidShadowTab::pio_readSidTab(integer gid, var bit [6:0] data) { integer status; bit [63:0] address; bit[63:0] rdata; address = NIU_SID + 8*gid; gen_pio_drv.pio_rd(address,rdata); data = rdata[6:0]; } function integer CSidShadowTab::getGid(var integer gid, bit [6:0] data){ integer status; if(assoc_index(CHECK,ShTab,data)) { gid = ShTab[data]; status = 1; } else { status = 0; gid = -1; } getGid = status; }