# Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
#       copyright notice, this list of conditions and the following
#       disclaimer in the documentation and/or other materials provided
#       with the distribution.
#     * Neither the name of The Linux Foundation nor the names of its
#       contributors may be used to endorse or promote products derived
#       from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
# ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

type vendor_sigmahal_qti, domain, coredomain;
type vendor_sigmahal_qti_exec, system_file_type , exec_type, file_type;

hal_server_domain(vendor_sigmahal_qti,vendor_sigmahal);
hal_attribute_hwservice(vendor_sigmahal, vendor_sigmahal_hwservice);

#Allow for transition from init domain to vendor_sigmahal_qti
init_daemon_domain(vendor_sigmahal_qti);

#Allow the interaction with servicemanager
binder_use(vendor_sigmahal_qti)

#Allow the interaction with wfdservice
binder_call(vendor_sigmahal_qti,wfdservice);

#Allow access to wfdservice_service,audioserver_service,surfaceflinger_service to interact with sigmahal_qti
allow vendor_sigmahal_qti {wfdservice_service audioserver_service surfaceflinger_service}:service_manager find;

#Allow vendor_sigmahal_qti to interact with audio_server
binder_call(vendor_sigmahal_qti,audioserver);

#Allow vendor_sigmahal_qti to interact with surface flinger
binder_call(vendor_sigmahal_qti,surfaceflinger);
