hgsl_hyp.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #ifndef GSL_HYP_INCLUDED
  7. #define GSL_HYP_INCLUDED
  8. #include "hgsl_utils.h"
  9. #include "hgsl_memory.h"
  10. /*
  11. * 2-stage connection diagramm
  12. *
  13. * GFX BE GFX FE
  14. * | |
  15. * | connect(main connection ID) |
  16. * | <----------------------------------- |
  17. * | |
  18. * | handshake(remote name, pid) |
  19. * | <----------------------------------- |
  20. * | |
  21. * | reply(result, client connection ID) |
  22. * | -----------------------------------> |
  23. * | |
  24. * | close connection on main ID |
  25. * | <----------------------------------- |
  26. * | |
  27. * | |
  28. * | connect(client connection ID) |
  29. * | <----------------------------------- |
  30. * | |
  31. * | sub handshake(client data) |
  32. * | <----------------------------------- |
  33. * | |
  34. * | reply(result) |
  35. * | -----------------------------------> |
  36. * | |
  37. * | |
  38. * | RPC function call(params data) |
  39. * | <----------------------------------- |
  40. * | |
  41. * | reply(result, return call data) |
  42. * | -----------------------------------> |
  43. * | |
  44. * | ... |
  45. */
  46. /*
  47. * protocol data format
  48. *
  49. * RPC function call
  50. *
  51. * <call magic><function ID><version><size><N: number of arguments>
  52. * <argument1>...<argument N><checksum>
  53. *
  54. *
  55. * RPC function argument
  56. *
  57. * <argument magic><argument ID><version><size><data><checksum>
  58. *
  59. */
  60. #include <linux/idr.h>
  61. #include <linux/list.h>
  62. #include <linux/mutex.h>
  63. #include <linux/types.h>
  64. #include <uapi/linux/hgsl.h>
  65. #include "hgsl_types.h"
  66. #include "hgsl_hyp_socket.h"
  67. #define OFFSET_OF(type, member) ((int) &((type *)0)->member)
  68. #define RPC_CLIENT_NAME_SIZE (64)
  69. struct hgsl_context;
  70. struct hgsl_priv;
  71. /* RPC opcodes */
  72. /* WARNING: when inserting new opcode, please insert it to the end before RPC_FUNC_LAST */
  73. /* Inserting the new opcode in the middle of the list will break the protocol ! */
  74. enum gsl_rpc_func_t {
  75. RPC_LIBRARY_OPEN = 0,
  76. RPC_LIBRARY_CLOSE,
  77. RPC_LIBRARY_VERSION,
  78. RPC_LIBRARY_SET_MEMNOTIFY_TYPE,
  79. RPC_DEVICE_OPEN,
  80. RPC_DEVICE_CLOSE,
  81. RPC_DEVICE_GETINFO,
  82. RPC_DEVICE_GETINFO_EXT,
  83. RPC_DEVICE_SETPOWERSTATE,
  84. RPC_DEVICE_WAITIRQ,
  85. RPC_DEVICE_GETIRQCNTRBASE,
  86. RPC_DEVICE_DUMPSTATE,
  87. RPC_COMMAND_ISSUEIB,
  88. RPC_COMMAND_INSERTFENCE,
  89. RPC_COMMAND_READTIMESTAMP,
  90. RPC_COMMAND_ISSUEIB_SYNC,
  91. RPC_COMMAND_ISSUEIB_WITH_ALLOC_LIST,
  92. RPC_COMMAND_CHECKTIMESTAMP,
  93. RPC_COMMAND_WAITTIMESTAMP,
  94. RPC_COMMAND_FREEMEMONTIMESTAMP,
  95. RPC_COMMAND_RESETSTATUS_INTERNAL,
  96. RPC_CONTEXT_CREATE,
  97. RPC_CONTEXT_DESTROY,
  98. RPC_CONTEXT_BINDGMEMSHADOW,
  99. RPC_CONTEXT_SETBINBASEOFFSET,
  100. RPC_MEMORY_READ,
  101. RPC_MEMORY_WRITE,
  102. RPC_MEMORY_COPY,
  103. RPC_MEMORY_SET,
  104. RPC_MEMORY_QUERYSTATS,
  105. RPC_MEMORY_ALLOC_PURE,
  106. RPC_MEMORY_PHYS_ALLOC_PURE,
  107. RPC_MEMORY_VIRT_ALLOC_PURE,
  108. RPC_MEMORY_FREE_PURE,
  109. RPC_MEMORY_CACHEOPERATION,
  110. RPC_MEMORY_NOTIFY,
  111. RPC_MEMORY_BIND,
  112. RPC_MEMORY_BIND_SYNC,
  113. RPC_MEMORY_MMAP,
  114. RPC_MEMORY_MUNMAP,
  115. RPC_MEMORY_CREATE_PAGETABLE,
  116. RPC_MEMORY_DESTROY_PAGETABLE,
  117. RPC_MEMORY_SET_PAGETABLE,
  118. RPC_COMMAND_FREEMEMONTIMESTAMP_PURE,
  119. RPC_PERFCOUNTER_SELECT,
  120. RPC_PERFCOUNTER_DESELECT,
  121. RPC_PERFCOUNTER_QUERYSELECTIONS,
  122. RPC_PERFCOUNTER_READ,
  123. RPC_SYNCOBJ_CREATE,
  124. RPC_SYNCOBJ_CREATE_FROM_BIND,
  125. RPC_SYNCOBJ_DESTROY,
  126. RPC_SYNCOBJ_WAIT,
  127. RPC_TIMESTAMP_CMP,
  128. RPC_SYNCOBJ_CLONE,
  129. RPC_SYNCOBJ_MERGE,
  130. RPC_SYNCOBJ_MERGE_MULTIPLE,
  131. RPC_SYNCSOURCE_CREATE,
  132. RPC_SYNCSOURCE_DESTROY,
  133. RPC_SYNCOBJ_CREATE_FROM_SOURCE,
  134. RPC_SYNCOBJ_SIGNAL,
  135. RPC_SYNCOBJ_WAIT_MULTIPLE,
  136. RPC_DEVICE_DEBUG,
  137. RPC_CFFDUMP_WAITIRQ,
  138. RPC_CFFDUMP_WRITEVERIFYFILE,
  139. RPC_MEMORY_MAP_EXT_FD_PURE, /* Linux extension */
  140. RPC_MEMORY_UNMAP_EXT_FD_PURE, /* Linux extension */
  141. RPC_GET_SHADOWMEM,
  142. RPC_PUT_SHADOWMEM,
  143. RPC_BLIT,
  144. RPC_HANDSHAKE,
  145. RPC_SUB_HANDSHAKE,
  146. RPC_DISCONNECT,
  147. RPC_MEMORY_SET_METAINFO,
  148. RPC_GET_SYSTEM_TIME,
  149. RPC_GET_DBQ_INFO,
  150. RPC_DBQ_CREATE,
  151. RPC_PERFCOUNTERS_READ,
  152. RPC_NOTIFY_CLEANUP,
  153. RPC_COMMAND_RESETSTATUS,
  154. RPC_CONTEXT_QUERY_DBCQ,
  155. RPC_CONTEXT_REGISTER_DBCQ,
  156. RPC_FUNC_LAST /* insert new func BEFORE this line! */
  157. };
  158. struct hgsl_hyp_priv_t {
  159. struct device *dev;
  160. struct mutex lock;
  161. struct list_head free_channels;
  162. struct list_head busy_channels;
  163. int conn_id;
  164. unsigned char client_name[RPC_CLIENT_NAME_SIZE];
  165. int client_pid;
  166. struct idr channel_idr;
  167. };
  168. /* backend i.e. server type: depends on server's underlying platform */
  169. enum gsl_rpc_server_type_t {
  170. GSL_RPC_SERVER_TYPE_1 = 1,
  171. GSL_RPC_SERVER_TYPE_2,
  172. GSL_RPC_SERVER_TYPE_3,
  173. GSL_RPC_SERVER_TYPE_LAST
  174. };
  175. /* frontend i.e. client type: depends on client's underlying platform */
  176. enum gsl_rpc_client_type_t {
  177. GSL_RPC_CLIENT_TYPE_1 = 1,
  178. GSL_RPC_CLIENT_TYPE_2,
  179. GSL_RPC_CLIENT_TYPE_3,
  180. GSL_RPC_CLIENT_TYPE_LAST
  181. };
  182. /* backend i.e. server mode in regards to the way of handling new client */
  183. enum gsl_rpc_server_mode_t {
  184. GSL_RPC_SERVER_MODE_1 = 1,
  185. GSL_RPC_SERVER_MODE_2,
  186. GSL_RPC_SERVER_MODE_3,
  187. GSL_RPC_SERVER_MODE_LAST
  188. };
  189. #pragma pack(push, 4)
  190. /* For RPC_HANDSHAKE version < 2 */
  191. struct handshake_params_t {
  192. uint32_t size;
  193. uint32_t client_type;
  194. uint32_t client_version;
  195. uint32_t pid;
  196. char name[RPC_CLIENT_NAME_SIZE];
  197. };
  198. struct handshake_params_v2_t {
  199. uint32_t size;
  200. uint32_t client_type;
  201. uint32_t client_version;
  202. uint32_t pid;
  203. char name[RPC_CLIENT_NAME_SIZE];
  204. /* user id in current namespace, if set to (uid_t)(-1),
  205. * backend will ignore it and use default settings
  206. */
  207. uint32_t uid;
  208. };
  209. struct sub_handshake_params_t {
  210. uint32_t size;
  211. uint32_t pid;
  212. uint32_t memdesc_size;
  213. };
  214. struct library_open_params_t {
  215. uint32_t size;
  216. uint32_t flags;
  217. };
  218. struct context_create_params_t {
  219. uint32_t size;
  220. uint32_t devhandle;
  221. enum gsl_context_type_t type;
  222. uint32_t flags;
  223. };
  224. struct context_destroy_params_t {
  225. uint32_t size;
  226. uint32_t devhandle;
  227. uint32_t ctxthandle;
  228. };
  229. struct get_shadowmem_params_v1_t {
  230. uint32_t size;
  231. enum gsl_deviceid_t device_id;
  232. uint32_t ctxthandle;
  233. };
  234. struct put_shadowmem_params_t {
  235. uint32_t size;
  236. uint32_t export_id;
  237. };
  238. struct shadowprop_t {
  239. uint32_t size;
  240. uint64_t sizebytes;
  241. uint32_t flags;
  242. };
  243. struct memory_alloc_params_t {
  244. uint32_t size;
  245. uint32_t sizebytes;
  246. uint32_t flags;
  247. };
  248. struct memory_free_params_t {
  249. uint32_t size;
  250. uint32_t flags;
  251. };
  252. struct memory_map_ext_fd_params_t {
  253. uint32_t size;
  254. int fd;
  255. uint64_t hostptr;
  256. uint64_t len;
  257. uint64_t offset;
  258. uint32_t memtype;
  259. uint32_t flags;
  260. };
  261. struct memory_unmap_ext_fd_params {
  262. uint32_t size;
  263. uint64_t gpuaddr;
  264. uint64_t hostptr;
  265. uint64_t len;
  266. uint32_t memtype;
  267. };
  268. struct hyp_ibdesc_t {
  269. uint32_t size;
  270. uint64_t gpuaddr;
  271. uint64_t server_priv_memdesc;
  272. uint32_t sizedwords;
  273. };
  274. struct command_issueib_params_t {
  275. uint32_t size;
  276. uint32_t devhandle;
  277. uint32_t ctxthandle;
  278. uint32_t numibs;
  279. uint32_t timestamp;
  280. uint32_t flags;
  281. };
  282. struct command_issueib_with_alloc_list_params {
  283. uint32_t size;
  284. uint32_t devhandle;
  285. uint32_t ctxthandle;
  286. uint32_t numibs;
  287. uint32_t numallocations;
  288. uint32_t timestamp;
  289. uint32_t flags;
  290. uint64_t syncobj;
  291. };
  292. struct memory_set_metainfo_params_t {
  293. uint64_t memdesc_priv;
  294. uint32_t flags;
  295. char metainfo[128];
  296. uint64_t metainfo_len;
  297. };
  298. struct command_waittimestamp_params_t {
  299. uint32_t size;
  300. uint32_t devhandle;
  301. uint32_t ctxthandle;
  302. uint32_t timestamp;
  303. uint32_t timeout;
  304. };
  305. struct command_readtimestamp_params_t {
  306. uint32_t size;
  307. uint32_t devhandle;
  308. uint32_t ctxthandle;
  309. enum gsl_timestamp_type_t type;
  310. };
  311. struct command_checktimestamp_params_t {
  312. uint32_t size;
  313. uint32_t devhandle;
  314. uint32_t ctxthandle;
  315. uint32_t timestamp;
  316. enum gsl_timestamp_type_t type;
  317. };
  318. struct get_system_time_params_t {
  319. uint32_t size;
  320. enum gsl_systemtime_usage_t usage;
  321. };
  322. struct get_dbq_info_params_t {
  323. uint32_t size;
  324. uint64_t gpuaddr;
  325. uint64_t priv_memdesc;
  326. uint32_t sizedwords;
  327. int q_idx;
  328. };
  329. struct dbq_create_params_t {
  330. uint32_t size;
  331. uint32_t ctxthandle;
  332. };
  333. struct syncobj_wait_multiple_params_t {
  334. uint32_t size;
  335. uint64_t num_syncobjs;
  336. uint32_t timeout_ms;
  337. };
  338. struct perfcounter_select_params_t {
  339. uint32_t size;
  340. uint32_t devhandle;
  341. uint32_t ctxthandle;
  342. int num_counters;
  343. };
  344. struct perfcounter_deselect_params_t {
  345. uint32_t size;
  346. uint32_t devhandle;
  347. uint32_t ctxthandle;
  348. uint32_t timestamp;
  349. int num_counters;
  350. };
  351. struct perfcounter_query_selections_params_t {
  352. uint32_t size;
  353. uint32_t devhandle;
  354. uint32_t ctxthandle;
  355. enum gsl_perfcountergroupid_t group;
  356. int num_counters;
  357. };
  358. struct perfcounter_read_params_t {
  359. uint32_t size;
  360. uint32_t devhandle;
  361. enum gsl_perfcountergroupid_t group;
  362. uint32_t counter;
  363. };
  364. struct notify_cleanup_params_t {
  365. uint32_t size;
  366. uint32_t timeout;
  367. };
  368. struct query_dbcq_params_t {
  369. uint32_t size;
  370. uint32_t devhandle;
  371. uint32_t ctxthandle;
  372. uint32_t length;
  373. };
  374. struct register_dbcq_params_t {
  375. uint32_t size;
  376. uint32_t devhandle;
  377. uint32_t ctxthandle;
  378. uint32_t len;
  379. uint32_t queue_body_offset;
  380. uint32_t export_id;
  381. };
  382. struct context_create_params_v1_t {
  383. uint32_t size;
  384. struct context_create_params_t ctxt_create_param;
  385. struct memory_map_ext_fd_params_t shadow_map_param;
  386. uint32_t dbq_off;
  387. };
  388. #pragma pack(pop)
  389. struct hgsl_hab_channel_t {
  390. struct list_head node;
  391. int socket;
  392. int id;
  393. bool wait_retry;
  394. bool busy;
  395. struct hgsl_hyp_priv_t *priv;
  396. struct gsl_hab_payload send_buf;
  397. struct gsl_hab_payload recv_buf;
  398. };
  399. struct hgsl_dbq_info {
  400. uint32_t export_id;
  401. uint32_t size;
  402. uint32_t head_dwords;
  403. int32_t head_off_dwords;
  404. uint32_t queue_dwords;
  405. int32_t queue_off_dwords;
  406. uint32_t db_signal;
  407. struct dma_buf *dma_buf;
  408. uint64_t gmuaddr;
  409. uint32_t ibdesc_max_size;
  410. struct hgsl_hab_channel_t *hab_channel;
  411. };
  412. int hgsl_hyp_init(struct hgsl_hyp_priv_t *priv, struct device *dev,
  413. int client_pid, const char * const client_name);
  414. void hgsl_hyp_close(struct hgsl_hyp_priv_t *priv);
  415. int hgsl_hyp_channel_pool_get(
  416. struct hgsl_hyp_priv_t *priv, int id, struct hgsl_hab_channel_t **channel);
  417. void hgsl_hyp_channel_pool_put(struct hgsl_hab_channel_t *hab_channel);
  418. int hgsl_hyp_generic_transaction(struct hgsl_hyp_priv_t *priv,
  419. struct hgsl_ioctl_hyp_generic_transaction_params *params,
  420. void **pSend, void **pReply, void *pRval);
  421. int hgsl_hyp_gsl_lib_open(struct hgsl_hyp_priv_t *priv,
  422. uint32_t flags, int32_t *rval);
  423. int hgsl_hyp_ctxt_create(struct hgsl_hab_channel_t *hab_channel,
  424. struct hgsl_ioctl_ctxt_create_params *hgsl_params);
  425. int hgsl_hyp_dbq_create(struct hgsl_hab_channel_t *hab_channel,
  426. uint32_t ctxthandle, uint32_t *dbq_info);
  427. int hgsl_hyp_ctxt_destroy(struct hgsl_hab_channel_t *hab_channel,
  428. uint32_t devhandle, uint32_t context_id, uint32_t *rval, uint32_t dbcq_export_id);
  429. int hgsl_hyp_get_shadowts_mem(struct hgsl_hab_channel_t *hab_channel,
  430. uint32_t context_id, uint32_t *shadow_ts_flags,
  431. struct hgsl_mem_node *mem_node);
  432. int hgsl_hyp_put_shadowts_mem(struct hgsl_hab_channel_t *hab_channel,
  433. struct hgsl_mem_node *mem_node);
  434. int hgsl_hyp_mem_map_smmu(struct hgsl_hab_channel_t *hab_channel,
  435. uint64_t size, uint64_t offset,
  436. struct hgsl_mem_node *mem_node);
  437. int hgsl_hyp_mem_unmap_smmu(struct hgsl_hab_channel_t *hab_channel,
  438. struct hgsl_mem_node *mem_node);
  439. int hgsl_hyp_set_metainfo(struct hgsl_hyp_priv_t *priv,
  440. struct hgsl_ioctl_set_metainfo_params *hgsl_param,
  441. const char *metainfo);
  442. int hgsl_hyp_issueib(struct hgsl_hyp_priv_t *priv,
  443. struct hgsl_ioctl_issueib_params *hgsl_param,
  444. struct hgsl_ibdesc *ib);
  445. int hgsl_hyp_issueib_with_alloc_list(struct hgsl_hyp_priv_t *priv,
  446. struct hgsl_ioctl_issueib_with_alloc_list_params *hgsl_param,
  447. struct gsl_command_buffer_object_t *ib,
  448. struct gsl_memory_object_t *allocations,
  449. struct gsl_memdesc_t *be_descs,
  450. uint64_t *be_offsets);
  451. int hgsl_hyp_wait_timestamp(struct hgsl_hyp_priv_t *priv,
  452. struct hgsl_wait_ts_info *hgsl_param);
  453. int hgsl_hyp_check_timestamp(struct hgsl_hyp_priv_t *priv,
  454. struct hgsl_ioctl_check_ts_params *hgsl_param);
  455. int hgsl_hyp_read_timestamp(struct hgsl_hyp_priv_t *priv,
  456. struct hgsl_ioctl_read_ts_params *hgsl_param);
  457. int hgsl_hyp_get_system_time(struct hgsl_hyp_priv_t *priv,
  458. uint64_t *hgsl_param);
  459. int hgsl_hyp_syncobj_wait_multiple(struct hgsl_hyp_priv_t *priv,
  460. uint64_t *rpc_syncobj, uint64_t num_syncobjs,
  461. uint32_t timeout_ms, int32_t *status, int32_t *result);
  462. int hgsl_hyp_perfcounter_select(struct hgsl_hyp_priv_t *priv,
  463. struct hgsl_ioctl_perfcounter_select_params *hgsl_param,
  464. uint32_t *groups, uint32_t *counter_ids,
  465. uint32_t *counter_val_regs, uint32_t *counter_val_hi_regs);
  466. int hgsl_hyp_perfcounter_deselect(struct hgsl_hyp_priv_t *priv,
  467. struct hgsl_ioctl_perfcounter_deselect_params *hgsl_param,
  468. uint32_t *groups, uint32_t *counter_ids);
  469. int hgsl_hyp_perfcounter_query_selections(struct hgsl_hyp_priv_t *priv,
  470. struct hgsl_ioctl_perfcounter_query_selections_params *hgsl_param,
  471. int32_t *selections);
  472. int hgsl_hyp_perfcounter_read(struct hgsl_hyp_priv_t *priv,
  473. struct hgsl_ioctl_perfcounter_read_params *hgsl_param);
  474. int hgsl_hyp_get_dbq_info(struct hgsl_hyp_priv_t *priv, uint32_t dbq_idx,
  475. struct hgsl_dbq_info *dbq_info);
  476. int hgsl_hyp_notify_cleanup(struct hgsl_hab_channel_t *hab_channel, uint32_t timeout);
  477. int hgsl_hyp_query_dbcq(struct hgsl_hab_channel_t *hab_channel, uint32_t devhandle,
  478. uint32_t ctxthandle, uint32_t length, uint32_t *db_signal, uint32_t *queue_gmuaddr,
  479. uint32_t *irq_idx);
  480. int hgsl_hyp_context_register_dbcq(struct hgsl_hab_channel_t *hab_channel,
  481. uint32_t devhandle, uint32_t ctxthandle, struct dma_buf *dma_buf, uint32_t size,
  482. uint32_t queue_body_offset, uint32_t *export_id);
  483. int hgsl_hyp_ctxt_create_v1(struct device *dev,
  484. struct hgsl_priv *priv,
  485. struct hgsl_hab_channel_t *hab_channel,
  486. struct hgsl_context *ctxt,
  487. struct hgsl_ioctl_ctxt_create_params *hgsl_params,
  488. int dbq_off, uint32_t *dbq_info);
  489. #endif