2020-05-24 15:30:55 -05:00
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
#ifndef _SMP_H_
|
|
|
|
#define _SMP_H_
|
|
|
|
/*
|
|
|
|
* Provides support for multi-threaded operation.
|
|
|
|
*
|
2022-01-29 10:11:15 -06:00
|
|
|
* Copyright (C) 2020-2022 Martin Whitaker.
|
2020-05-24 15:30:55 -05:00
|
|
|
*/
|
|
|
|
|
2021-12-05 07:47:31 -06:00
|
|
|
#include <stdbool.h>
|
2020-05-24 15:30:55 -05:00
|
|
|
#include <stdint.h>
|
|
|
|
|
|
|
|
#include "boot.h"
|
|
|
|
|
|
|
|
#include "barrier.h"
|
|
|
|
#include "spinlock.h"
|
|
|
|
|
|
|
|
/*
|
2022-01-31 13:47:32 -06:00
|
|
|
* The maximum number of active CPU cores. In the current implementation this
|
|
|
|
* is limited to 256 both by the number of available APIC IDs and the need to
|
|
|
|
* fit both the program and the CPU stacks in low memory.
|
2020-05-24 15:30:55 -05:00
|
|
|
*/
|
2022-01-31 13:47:32 -06:00
|
|
|
#define MAX_PCPUS 256
|
2020-05-24 15:30:55 -05:00
|
|
|
|
|
|
|
/*
|
2022-01-31 13:47:32 -06:00
|
|
|
* The current state of a CPU core.
|
2020-05-24 15:30:55 -05:00
|
|
|
*/
|
2022-01-31 13:47:32 -06:00
|
|
|
typedef enum __attribute__ ((packed)) {
|
|
|
|
CPU_STATE_DISABLED = 0,
|
|
|
|
CPU_STATE_ENABLED = 1,
|
|
|
|
CPU_STATE_RUNNING = 2
|
|
|
|
} cpu_state_t;
|
2020-05-24 15:30:55 -05:00
|
|
|
|
|
|
|
/*
|
2022-01-31 13:47:32 -06:00
|
|
|
* The number of available physical CPU cores. Initially this is 1, but may
|
2020-05-24 15:30:55 -05:00
|
|
|
* increase after calling smp_init().
|
|
|
|
*/
|
|
|
|
extern int num_pcpus;
|
|
|
|
|
2020-12-11 10:15:42 -06:00
|
|
|
/*
|
|
|
|
* The search step that located the ACPI RSDP (for debug).
|
|
|
|
*/
|
|
|
|
extern const char *rsdp_source;
|
|
|
|
/*
|
|
|
|
* The address of the ACPI RSDP (for debug).
|
|
|
|
*/
|
|
|
|
extern uintptr_t rsdp_addr;
|
|
|
|
|
2020-05-24 15:30:55 -05:00
|
|
|
/*
|
|
|
|
* Initialises the SMP state and detects the number of physical CPUs.
|
|
|
|
*/
|
2020-12-10 06:52:58 -06:00
|
|
|
void smp_init(bool smp_enable);
|
2020-05-24 15:30:55 -05:00
|
|
|
|
|
|
|
/*
|
2022-01-31 13:47:32 -06:00
|
|
|
* Starts the APs listed as enabled in pcpu_state. Returns 0 on success
|
|
|
|
* or the index number of the lowest-numbered AP that failed to start.
|
2020-05-24 15:30:55 -05:00
|
|
|
*/
|
2022-01-31 13:47:32 -06:00
|
|
|
int smp_start(cpu_state_t pcpu_state[MAX_PCPUS]);
|
2020-05-24 15:30:55 -05:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Returns the ordinal number of the calling PCPU.
|
|
|
|
*/
|
|
|
|
int smp_my_pcpu_num(void);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Allocates and initialises a barrier object in pinned memory.
|
|
|
|
*/
|
|
|
|
barrier_t *smp_alloc_barrier(int num_threads);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Allocates and initialises a spinlock object in pinned memory.
|
|
|
|
*/
|
|
|
|
spinlock_t *smp_alloc_mutex();
|
|
|
|
|
|
|
|
#endif /* _SMP_H_ */
|