etnaviv_buffer.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2014-2025 Etnaviv Project
  4. */
  5. #ifndef __ETNAVIV_BUFFER_H__
  6. #define __ETNAVIV_BUFFER_H__
  7. #include "etnaviv_cmdbuf.h"
  8. #include "etnaviv_gpu.h"
  9. #include "etnaviv_gem.h"
  10. #include "etnaviv_mmu.h"
  11. #include "common.xml.h"
  12. #include "linux/printk.h"
  13. #include "state.xml.h"
  14. #include "state_blt.xml.h"
  15. #include "state_hi.xml.h"
  16. #include "state_3d.xml.h"
  17. #include "cmdstream.xml.h"
  18. static inline void OUT(struct etnaviv_cmdbuf *buffer, u32 data)
  19. {
  20. u32 *vaddr = (u32 *)buffer->vaddr;
  21. BUG_ON(buffer->user_size >= buffer->size);
  22. vaddr[buffer->user_size / 4] = data;
  23. buffer->user_size += 4;
  24. }
  25. static inline void CMD_LOAD_STATE(struct etnaviv_cmdbuf *buffer, u32 reg,
  26. u32 value)
  27. {
  28. u32 index = reg >> VIV_FE_LOAD_STATE_HEADER_OFFSET__SHR;
  29. buffer->user_size = ALIGN(buffer->user_size, 8);
  30. /* write a register via cmd stream */
  31. OUT(buffer, VIV_FE_LOAD_STATE_HEADER_OP_LOAD_STATE |
  32. VIV_FE_LOAD_STATE_HEADER_COUNT(1) |
  33. VIV_FE_LOAD_STATE_HEADER_OFFSET(index));
  34. OUT(buffer, value);
  35. }
  36. static inline void CMD_LOAD_STATES_START(struct etnaviv_cmdbuf *buffer, u32 reg,
  37. u32 nvalues)
  38. {
  39. u32 index = reg >> VIV_FE_LOAD_STATE_HEADER_OFFSET__SHR;
  40. buffer->user_size = ALIGN(buffer->user_size, 8);
  41. /* write a register via cmd stream */
  42. OUT(buffer, VIV_FE_LOAD_STATE_HEADER_OP_LOAD_STATE |
  43. VIV_FE_LOAD_STATE_HEADER_OFFSET(index) |
  44. VIV_FE_LOAD_STATE_HEADER_COUNT(nvalues));
  45. }
  46. static inline void CMD_END(struct etnaviv_cmdbuf *buffer)
  47. {
  48. buffer->user_size = ALIGN(buffer->user_size, 8);
  49. OUT(buffer, VIV_FE_END_HEADER_OP_END);
  50. }
  51. static inline void CMD_WAIT(struct etnaviv_cmdbuf *buffer,
  52. unsigned int waitcycles)
  53. {
  54. buffer->user_size = ALIGN(buffer->user_size, 8);
  55. OUT(buffer, VIV_FE_WAIT_HEADER_OP_WAIT | waitcycles);
  56. }
  57. static inline void CMD_LINK(struct etnaviv_cmdbuf *buffer, u16 prefetch,
  58. u32 address)
  59. {
  60. buffer->user_size = ALIGN(buffer->user_size, 8);
  61. OUT(buffer,
  62. VIV_FE_LINK_HEADER_OP_LINK | VIV_FE_LINK_HEADER_PREFETCH(prefetch));
  63. OUT(buffer, address);
  64. }
  65. static inline void CMD_STALL(struct etnaviv_cmdbuf *buffer, u32 from, u32 to)
  66. {
  67. buffer->user_size = ALIGN(buffer->user_size, 8);
  68. OUT(buffer, VIV_FE_STALL_HEADER_OP_STALL);
  69. OUT(buffer, VIV_FE_STALL_TOKEN_FROM(from) | VIV_FE_STALL_TOKEN_TO(to));
  70. }
  71. static inline void CMD_SEM(struct etnaviv_cmdbuf *buffer, u32 from, u32 to)
  72. {
  73. CMD_LOAD_STATE(buffer, VIVS_GL_SEMAPHORE_TOKEN,
  74. VIVS_GL_SEMAPHORE_TOKEN_FROM(from) |
  75. VIVS_GL_SEMAPHORE_TOKEN_TO(to));
  76. }
  77. #endif /* __ETNAVIV_BUFFER_H__ */