aboutsummaryrefslogtreecommitdiff
path: root/product/synquacer/module/synquacer_system/src/transaction_sw.c
blob: 2398b00868995670ef99a711b33621b8477e8ad9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/*
 * Arm SCP/MCP Software
 * Copyright (c) 2018-2020, Arm Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include "low_level_access.h"
#include "synquacer_common.h"

#include <internal/transaction_sw.h>

#include <mod_synquacer_system.h>

#include <fwk_log.h>

#include <inttypes.h>
#include <stdint.h>

#define STATUS_ADDR 4

void set_transactionsw_off(
    uint32_t transactionsw_reg_addr,
    uint32_t disable_bit)
{
    unsigned int intsts;
    uint32_t value;

    FWK_LOG_INFO("  traSW disable_bit =  %08" PRIx32, disable_bit);

    DI(intsts);

    /* read transactionsw */
    value = readl(transactionsw_reg_addr);

    /* Clear transationsw disable bit */
    value &= (~disable_bit);

    /* transation sw enable */
    writel(transactionsw_reg_addr, value);

    EI(intsts);

    /* setting wait */
    while ((readl(transactionsw_reg_addr + STATUS_ADDR) & disable_bit) != 0)
        continue;
}

void set_transactionsw_on(uint32_t transactionsw_reg_addr, uint32_t enable_bit)
{
    unsigned int intsts;
    uint32_t value;

    FWK_LOG_INFO("  traSW enable_bit =  %08" PRIx32, enable_bit);

    DI(intsts);

    /* read transactionsw */
    value = readl(transactionsw_reg_addr);

    /* Clear transactionsw disable bit */
    value |= (enable_bit);

    /* transaction sw enable */
    writel(transactionsw_reg_addr, value);

    EI(intsts);

    /* setting wait */
    while ((readl(transactionsw_reg_addr + STATUS_ADDR) & enable_bit) !=
           enable_bit) {
        continue;
    }
}