summaryrefslogtreecommitdiffstats
path: root/kernel/gsp_sema_service.h
blob: a6893bd6ff4278cdee75c1f3019ed7a15b630e06 (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
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _GSP_SEMA_SERVICE_H_
#define _GSP_SEMA_SERVICE_H_

/*
 * Emulated-GPU progress service: discovers the guest's GPU-VA -> guest-PA
 * mapping and applies the copy-engine semaphore releases found in mapped
 * pages, so that the guest's UVM progress waits complete.
 *
 * See gsp_sema_service.c for the full description.
 */

/*
 * A guest channel, registered when the driver allocates it. The service uses
 * the channel's GPFIFO + USERD to notice submissions as they happen (instead
 * of discovering the pushed work by scanning guest RAM) and to run the pushed
 * work promptly.
 *
 * All addresses are guest-physical except gpfifo_va, which is the GPU VA of
 * the channel's GPFIFO ring (translated through the discovered VA->PA map).
 */
struct sema_channel_desc {
	u32 h_object;
	u32 engine_type;
	u32 cid;		/* RM channel id (the doorbell token vector) */
	u64 gpfifo_va;
	u32 gpfifo_entries;
	u64 userd_pa;		/* NvA06FControl: GPGet @0x88, GPPut @0x8c */
	u32 userd_as;		/* NV_ADDR_SYSMEM(1) / NV_ADDR_FBMEM(2) */
	u64 instance_pa;
	u64 notifier_pa;
	u32 notifier_as;	/* NV_ADDR_SYSMEM(1) / NV_ADDR_FBMEM(2) */
};

void gsp_sema_service_channel_add(const struct sema_channel_desc *desc);
void gsp_sema_service_channel_del(u32 h_object);

/*
 * A GPU VA space whose top-level page directory the driver has published (the
 * driver builds its own page tables for the address spaces it owns, then hands
 * the directory's physical address to the GPU through SET_PAGE_DIRECTORY).
 *
 * pdb is the directory base in the aperture selected by b_vidmem (false =
 * guest RAM, true = emulated vidmem); num_entries is the root entry count and
 * fixes the number of VA bits the root covers.
 */
struct sema_vaspace_desc {
	u32 h_vaspace;
	u64 pdb;
	u32 num_entries;
	bool b_vidmem;
};

void gsp_sema_service_vaspace_add(const struct sema_vaspace_desc *desc);
void gsp_sema_service_vaspace_del(u32 h_vaspace);

int  gsp_sema_service_start(void);
void gsp_sema_service_stop(void);
int  gsp_sema_service_probe(u64 gpu_va, u32 count);
int  gsp_sema_service_add_map(u64 gpu_va, u64 pa, u64 len);
void gsp_sema_service_doorbell(u32 token);

#endif /* _GSP_SEMA_SERVICE_H_ */