#!/usr/bin/env python
# Copyright (c) 2009-2011 Arastra, Inc.  All rights reserved.
# Arastra, Inc. Confidential and Proprietary.

import Pci, sys, os
import Tac, EntityManager
import ScdRegisters

entityManager = None

def mountSystemScd( sysname ):
   global entityManager
   entityManager = EntityManager.Sysdb( sysname=sysname )
   mg = entityManager.mountGroup()
   mg.mount( 'hardware/scd/config', 'Hardware::Scd::Config', 'r' )
   mg.close( blocking=True )

def mountCellScd( sysname, cell ):
   global entityManager
   entityManager = EntityManager.Sysdb( sysname=sysname )
   mg = entityManager.mountGroup()
   mg.mount( 'hardware/cell/%s/scd/config' % cell, 'Hardware::Scd::Config', 'r' )
   mg.mount( 'cell/%s/hardware/pciDeviceStatusDir' % cell,
             'Hardware::PciDeviceStatusDir', 'r' )
   mg.close( blocking=True )

def usage():
   print """usage: scdTest <pciaddress|cardname> [iterations [bytes]]
      pciaddress=DDDD:BB:SS.F D=Domain, B=BusNumber, S=Slot Function
      cardname is the name of the card, e.g. Linecard3, Fabric1 

   e.g.
      scdTest Supervisor1 1000 1000
   read first 1000 bytes of scd resource0 1000 times.
   """
   sys.exit(1)

if len( sys.argv ) == 1:
   usage()

if ':' in sys.argv[1]: 
   # assume the user has entered a pci address
   scdDev = Pci.Device( sys.argv[1] )
   if(scdDev.id() != ScdRegisters.PciId):
      print "device %s is not a scd" % sys.argv[1]
      sys.exit(1)
   scd = scdDev.sysfsPath( "resource0" )
else:
   # assume a card number has been entered, we need to get the pci
   # address from sysdb
   if sys.argv[1].startswith( 'Supervisor' ):
      cellId = sys.argv[1][10:]
      mountCellScd( 'ar', cellId )
      scdAddress = entityManager.root()[ 'hardware' ][ 'cell' ][ cellId ][ 'scd' ][ 
                   'config' ].scdConfig[ 'Supervisor%s' % cellId 
                   ].ham.hamImpl.address
   elif sys.argv[1] == 'FixedSystem':
      mountCellScd( 'ar', '1' )
      scdAddress = entityManager.root()[ 'hardware' ][ 'cell' ][ '1' ][ 'scd' ][ 
                   'config' ].scdConfig[ 'FixedSystem' ].ham.hamImpl.address
   else:
      mountSystemScd( 'ar' )
      scdAddress = entityManager.root()[ 'hardware' ][ 'scd' ][ 'config'
                   ].scdConfig[ sys.argv[1] ].ham.hamImpl.address
   pciAddr = "%04x:%02x:%02x.%x" % ( scdAddress.domain, scdAddress.bus, 
                                     scdAddress.slot, scdAddress.function )
   scdDev = Pci.Device( pciAddr )
   if(scdDev.id() != ScdRegisters.PciId):
      print "device %s is not a scd" % sys.argv[1]
      sys.exit(1)
   scd = scdDev.sysfsPath( "resource0" )

offset = ScdRegisters.scdPciOffset()

if not scd:
   print "Scd device not found"
   sys.exit(1)

if len( sys.argv ) == 2:
   iterations = 1000
   bytes = 1000
elif len( sys.argv ) == 3:
   iterations = int( sys.argv[2] )
   bytes = 1000
elif len( sys.argv ) == 4:
   iterations = int( sys.argv[2] )
   bytes = int( sys.argv[3] )
else:
   usage()

sys.exit( os.system( "testmmapfile %s %d %d" % ( scd, iterations, bytes ) ) )

