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

# pylint: disable=consider-using-f-string

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): # pylint: disable=superfluous-parens
      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): # pylint: disable=superfluous-parens
      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 # pylint: disable=redefined-builtin
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 ) ) )

