#!/usr/bin/env python3

# register definition format:
# ('register name', 'register offset', 'register type')
#
# register types:
#  '' - normal register
#  'DPIO' - DPIO register

import argparse
import os
import sys
import ast
import subprocess
import chipset
import reg_access as reg

def parse_file(file):
	print('{0:^10s} | {1:^28s} | {2:^10s}'. format('offset', file.name, 'value'))
	print('-' * 54)
	for line in file:
		register = ast.literal_eval(line)
		if register[2] == 'DPIO':
			val = reg.dpio_read(register[1], 0)
		else:
			val = reg.read(register[1])
		intreg = int(register[1], 16)
		print('{0:#010x} | {1:<28} | {2:#010x}'.format(intreg, register[0], val))
	print('')


parser = argparse.ArgumentParser(description='Dumb register dumper.')
parser.add_argument('-b', '--baseless', action='store_true', default=False, help='baseless mode, ignore files starting with base_')
parser.add_argument('-a', '--autodetect', action='store_true', default=False, help='autodetect chipset')
parser.add_argument('profile', nargs='?', type=argparse.FileType('r'), default=None)
args = parser.parse_args()

if reg.init() == False:
	print("Register initialization failed")
	sys.exit()

# Put us where the script is
os.chdir(os.path.dirname(sys.argv[0]))

#parse anything named base_ these are assumed to apply for all gens.
if args.baseless == False:
	for root, dirs, files in os.walk('.'):
		for name in files:
			if name.startswith(("base_")):
				file = open(name.rstrip(), 'r')
				parse_file(file)

if args.autodetect:
	pci_dev = chipset.intel_get_pci_device()
	devid = chipset.pcidev_to_devid(pci_dev)
	if chipset.is_sandybridge(devid):
		args.profile = open('sandybridge', 'r')
	elif chipset.is_ivybridge(devid):
		args.profile = open('ivybridge', 'r')
	elif chipset.is_valleyview(devid):
		args.profile = open('valleyview', 'r')
	elif chipset.is_haswell(devid):
		args.profile = open('haswell', 'r')
	elif chipset.is_broadwell(devid):
		args.profile = open('broadwell', 'r')
	else:
		print("Autodetect of devid " + hex(devid) + " failed")

if args.profile == None:
	sys.exit()

for extra in args.profile:
	extra_file = open(extra.rstrip(), 'r')
	parse_file(extra_file)
