/*
 * Copright 2019, Data61
 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
 * ABN 41 687 119 230.
 *
 * This software may be distributed and modified according to the terms of
 * the GNU General Public License version 2. Note that NO WARRANTY is provided.
 * See "LICENSE_GPLv2.txt" for details.
 *
 * @TAG(DATA61_GPL)
 */

#pragma once

#include <platsupport/io.h>

#define TX2_HSP_PADDR 0x3c00000
#define TX2_HSP_SIZE 0xa0000

/*
 * This is a very basic driver implementation of the TX2 HSP mechanisms. So
 * far, this only supports the doorbell functionality of the HSP mechanisms.
 *
 * The doorbells are essentially a signalling mechanism that allows the
 * processor and co-processors to notify one another of incoming requests. The
 * HSP mechanisms also offer more sophisticated synchronisation mechanisms like
 * semaphores, message queues, and stateful semaphores. However, because of
 * time and a lack of a need for these advanced features, support for these
 * advanced features are missing.
 *
 * This driver is mainly used by only the BPMP driver in this same library, but
 * it is possible to use it for other purposes, see DESIGN.md in the root of
 * the libtx2bpmp folder for more details.
 */

enum tx2_doorbell_id {
    /* See Table 121, above Section 14.5.2 in the technical reference manual */
    CCPLEX_PM_DBELL, // CCPLEX power management
    CCPLEX_TZ_UNSECURE_DBELL, // CCPLEX TrustZone not secure
    CCPLEX_TZ_SECURE_DBELL, // CCPLEX TrustZone secure
    BPMP_DBELL,
    SPE_DBELL,
    SCE_DBELL,
    APE_DBELL
};

typedef struct tx2_hsp {
    void *hsp_base;
    void *doorbell_base;
} tx2_hsp_t;

/*
 * Initialises the TX2 HSP interface.
 *
 * @param io_ops Initialised IO ops interface.
 * @param hsp Empty tx2 hsp struct that will be filled in.
 *
 * @return 0 on success, otherwise an error code.
 */
int tx2_hsp_init(ps_io_ops_t *io_ops, tx2_hsp_t *hsp);

/*
 * Destroys an initialised TX2 HSP interface.
 *
 * @param io_ops The same IO ops interface that was used to initialise the HSP interface.
 * @param hsp Initialised HSP interface that will be destroyed.
 *
 * @return 0 on success, otherwise an error code.
 */
int tx2_hsp_destroy(ps_io_ops_t *io_ops, tx2_hsp_t *hsp);

/*
 * Rings the doorbell of a specific device module.
 *
 * @param hsp Initialised HSP interface.
 * @param db_id The ID of the desired doorbell to ring.
 *
 * @return 0 on success, otherwise an error code.
 */
int tx2_hsp_doorbell_ring(tx2_hsp_t *hsp, enum tx2_doorbell_id db_id);

/*
 * Checks if a specific device module has rung our doorbell.
 *
 * @param hsp Initialised HSP interface.
 * @param db_id The ID of the corresponding device module doorbell to check.
 *
 * @return 0 on success, otherwise an error code.
 */
int tx2_hsp_doorbell_check(tx2_hsp_t *hsp, enum tx2_doorbell_id db_id);
