// Copyright 2016 The Fuchsia Authors
// Copyright (c) 2008-2014 Travis Geiselbrecht
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

#pragma once

/* #defines for the cache routines below */
#define ICACHE 1
#define DCACHE 2
#define UCACHE (ICACHE|DCACHE)

#ifndef __ASSEMBLER__

#include <arch/defines.h>
#include <kernel/atomic.h>
#include <kernel/cpu.h>
#include <zircon/compiler.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <sys/types.h>

__BEGIN_CDECLS

/* fast routines that most arches will implement inline */
static void arch_enable_ints(void);
static void arch_disable_ints(void);
static bool arch_ints_disabled(void);

static uint64_t arch_cycle_count(void);

static cpu_num_t arch_curr_cpu_num(void);
static uint arch_max_num_cpus(void);
static uint arch_cpu_features(void);

void arch_disable_cache(uint flags);
void arch_enable_cache(uint flags);

void arch_clean_cache_range(addr_t start, size_t len);
void arch_clean_invalidate_cache_range(addr_t start, size_t len);
void arch_invalidate_cache_range(addr_t start, size_t len);
void arch_sync_cache_range(addr_t start, size_t len);

/* Used to suspend work on a CPU until it is further shutdown.
 * This will only be invoked with interrupts disabled.  This function
 * must not re-enter the scheduler.
 * flush_done should be signaled after state is flushed. */
typedef struct event event_t;
void arch_flush_state_and_halt(event_t *flush_done) __NO_RETURN;

int arch_idle_thread_routine(void*) __NO_RETURN;

/* function to call in spinloops to idle */
static void arch_spinloop_pause(void);

/* arch optimized version of a page zero routine against a page aligned buffer */
void arch_zero_page(void *);

/* give the specific arch a chance to override some routines */
#include <arch/arch_ops.h>

/* The arch_blocking_disallowed() flag is used to check that in-kernel interrupt
 * handlers do not do any blocking operations.  This is a per-CPU flag.
 * Various blocking operations, such as mutex_acquire(), contain assertions
 * that arch_blocking_disallowed() is false.
 *
 * arch_blocking_disallowed() should only be true when interrupts are
 * disabled. */
static inline bool arch_blocking_disallowed(void) {
    return READ_PERCPU_FIELD32(blocking_disallowed);
}

static inline void arch_set_blocking_disallowed(bool value) {
    WRITE_PERCPU_FIELD32(blocking_disallowed, value);
}

__END_CDECLS

#endif // !__ASSEMBLER__
