linaro-vendor-package: Add hikey960/hikey binary objects

Add bootloader objects and mali libraries and TI firmware
for both hikey and hikey960 to the linaro-vendor-package.

Signed-off-by: John Stultz <john.stultz@linaro.org>
diff --git a/src/hikey960/bootloader/mkdtimg b/src/hikey960/bootloader/mkdtimg
new file mode 100755
index 0000000..6572204
--- /dev/null
+++ b/src/hikey960/bootloader/mkdtimg
@@ -0,0 +1,159 @@
+#!/usr/bin/env python
+# Copyright 2017, The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+from __future__ import print_function
+try:
+	from os import fstat, stat, remove
+	from sys import exit
+	from argparse import ArgumentParser, FileType
+	from ctypes import sizeof, Structure, c_char, c_int
+	from struct import pack, calcsize
+	import zlib
+except Exception as e:
+	print("some module is needed:" + str(e))
+	exit(-1)
+
+dt_head_info_fmt = '4sII'
+dt_entry_fmt = 'Q4I2Q'
+dtimg_version = 1
+dtb_count = 1
+
+def write32(output, value):
+	output.write(chr(value & 255)) ; value=value // 256
+	output.write(chr(value & 255)) ; value=value // 256
+	output.write(chr(value & 255)) ; value=value // 256
+	output.write(chr(value & 255))
+
+def compress(filename, input, output):
+	output.write('\037\213\010')
+	output.write(chr(0))
+
+	statval = stat(filename)
+	write32(output, 0)
+	output.write('\002')
+	output.write('\003')
+
+	crcval = zlib.crc32("")
+	compobj = zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS,
+		zlib.DEF_MEM_LEVEL, 0)
+	while True:
+		data = input.read(1024)
+		if data == "":
+			break
+		crcval = zlib.crc32(data, crcval)
+		output.write(compobj.compress(data))
+	output.write(compobj.flush())
+	write32(output, crcval)
+	write32(output, statval.st_size)
+
+def dtb_compress(dtb_file):
+	try:
+		outputname = dtb_file + '.gz'
+		input = open(dtb_file, 'rb')
+		output = open(outputname, 'wb')
+		compress(dtb_file, input, output)
+		input.close()
+		output.close()
+	except Exception as e:
+		print('dtb_compress error:' + str(e))
+		exit(-1)
+	return outputname
+
+class dt_head_info(Structure):
+	_fields_ = [('magic', c_char * 4),
+		    ('version', c_int),
+		    ('dt_count', c_int)]
+
+class dt_entry_t(Structure):
+	_fields_ = [('dtb_size', c_int),
+		    ('dtb_offset', c_int)]
+
+def align_page_size(offset, pagesize):
+	return (pagesize - (offset % pagesize))
+
+def write_head_info(head_info, args):
+	args.output.write(pack(dt_head_info_fmt,
+			       head_info.magic,
+			       head_info.version,
+			       head_info.dt_count))
+
+def write_dtb_entry_t(dt_entry, args):
+	args.output.write(pack(dt_entry_fmt,
+			       0,  # reserved
+			       dt_entry.dtb_size,
+			       0,  # reserved
+			       dt_entry.dtb_offset,
+			       0,  # reserved
+			       0,  # reserved
+			       0)) # reserved
+
+def write_padding(args, padding):
+	for i in range(0, padding):
+		args.output.write('\x00')
+
+def write_dtb(args):
+	dtb_file = args.dtb
+	out_dtb = dtb_file
+	if args.compress == True:
+		out_dtb = dtb_compress(dtb_file)
+	try:
+		dtb_offset = calcsize(dt_head_info_fmt) + \
+				      calcsize(dt_entry_fmt) + \
+				      4
+		padding = align_page_size(dtb_offset, args.pagesize)
+		dtb_size = stat(out_dtb).st_size
+		dtb_size_padding = align_page_size(dtb_size, args.pagesize)
+		dt_entry = dt_entry_t(dtb_size + dtb_size_padding,
+				      dtb_offset + padding)
+		write_dtb_entry_t(dt_entry, args)
+		args.output.write(pack('I', 0)) # SUCCESS code number
+		write_padding(args, padding)
+		with open(out_dtb, 'rb') as dtb_fd:
+			args.output.write(dtb_fd.read(dtb_size))
+			write_padding(args, dtb_size_padding)
+	except Exception as e:
+		print('write dtb error:' + str(e))
+		exit(-1)
+
+def clean_gz_file(args):
+	try:
+		if args.compress != True:
+			return
+		remove(args.dtb + '.gz')
+	except Exception as e:
+		print('clean gz file error:' + str(e))
+		exit(-1)
+
+def parse_cmdline():
+	parser = ArgumentParser()
+	parser.add_argument('-c', '--compress', help='compress dtb or not',
+			    action='store_true')
+	parser.add_argument('-d', '--dtb', help='path to the dtb', type=str,
+			    required=True)
+	parser.add_argument('-s', '--pagesize', help='align page size',
+			    type=int, choices=[2**i for i in range(11,15)],
+			    default=2048)
+	parser.add_argument('-o', '--output', help='output file name',
+			    type=FileType('wb'), required=True)
+	return parser.parse_args()
+
+def main():
+	args = parse_cmdline()
+	dtimg_head_info = dt_head_info('HSDT', dtimg_version, dtb_count)
+	write_head_info(dtimg_head_info, args)
+	write_dtb(args)
+	clean_gz_file(args)
+
+if __name__ == '__main__':
+	main()