cam_cpas_api.h 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #ifndef _CAM_CPAS_API_H_
  7. #define _CAM_CPAS_API_H_
  8. #include <linux/device.h>
  9. #include <linux/platform_device.h>
  10. #include <media/cam_cpas.h>
  11. #include "cam_soc_util.h"
  12. #define CAM_HW_IDENTIFIER_LENGTH 128
  13. /* Default AXI Bandwidth vote */
  14. #define CAM_CPAS_DEFAULT_AXI_BW 1024
  15. /* Default RT AXI Bandwidth vote */
  16. #define CAM_CPAS_DEFAULT_RT_AXI_BW 2000000000L
  17. #define CAM_CPAS_MAX_PATHS_PER_CLIENT 15
  18. #define CAM_CPAS_API_PATH_DATA_STD_START 512
  19. /* Qos Selection mask */
  20. #define CAM_CPAS_QOS_DEFAULT_SETTINGS_MASK 0x1
  21. #define CAM_CPAS_QOS_CUSTOM_SETTINGS_MASK 0x2
  22. /**
  23. * enum cam_cpas_reg_base - Enum for register base identifier. These
  24. * are the identifiers used in generic register
  25. * write/read APIs provided by cpas driver.
  26. */
  27. enum cam_cpas_reg_base {
  28. CAM_CPAS_REG_CPASTOP,
  29. CAM_CPAS_REG_CAMNOC,
  30. CAM_CPAS_REG_CAMSS,
  31. CAM_CPAS_REG_RPMH,
  32. CAM_CPAS_REG_MAX
  33. };
  34. /**
  35. * enum cam_cpas_hw_index - Enum for identify HW index
  36. */
  37. enum cam_cpas_hw_index {
  38. CAM_CPAS_HW_IDX_ANY = 0,
  39. CAM_CPAS_HW_IDX_0 = 1<<0,
  40. CAM_CPAS_HW_IDX_1 = 1<<1,
  41. CAM_CPAS_HW_IDX_2 = 1<<2,
  42. CAM_CPAS_HW_IDX_3 = 1<<3,
  43. CAM_CPAS_HW_IDX_4 = 1<<4,
  44. CAM_CPAS_HW_IDX_5 = 1<<5,
  45. CAM_CPAS_HW_IDX_6 = 1<<6,
  46. CAM_CPAS_HW_IDX_7 = 1<<7,
  47. CAM_CPAS_HW_IDX_MAX = 1<<8
  48. };
  49. /**
  50. * enum cam_cpas_camera_version Enum for Titan Camera Versions
  51. */
  52. enum cam_cpas_camera_version {
  53. CAM_CPAS_CAMERA_VERSION_NONE = 0,
  54. CAM_CPAS_CAMERA_VERSION_150 = 0x00010500,
  55. CAM_CPAS_CAMERA_VERSION_170 = 0x00010700,
  56. CAM_CPAS_CAMERA_VERSION_175 = 0x00010705,
  57. CAM_CPAS_CAMERA_VERSION_480 = 0x00040800,
  58. CAM_CPAS_CAMERA_VERSION_520 = 0x00050200,
  59. CAM_CPAS_CAMERA_VERSION_540 = 0x00050400,
  60. CAM_CPAS_CAMERA_VERSION_580 = 0x00050800,
  61. CAM_CPAS_CAMERA_VERSION_545 = 0x00050405,
  62. CAM_CPAS_CAMERA_VERSION_570 = 0x00050700,
  63. CAM_CPAS_CAMERA_VERSION_680 = 0x00060800,
  64. CAM_CPAS_CAMERA_VERSION_165 = 0x00010605,
  65. CAM_CPAS_CAMERA_VERSION_780 = 0x00070800,
  66. CAM_CPAS_CAMERA_VERSION_640 = 0x00060400,
  67. CAM_CPAS_CAMERA_VERSION_880 = 0x00080800,
  68. CAM_CPAS_CAMERA_VERSION_MAX
  69. };
  70. /**
  71. * enum cam_cpas_version Enum for Titan CPAS Versions
  72. */
  73. enum cam_cpas_version {
  74. CAM_CPAS_VERSION_NONE = 0,
  75. CAM_CPAS_VERSION_100 = 0x10000000,
  76. CAM_CPAS_VERSION_101 = 0x10000001,
  77. CAM_CPAS_VERSION_110 = 0x10010000,
  78. CAM_CPAS_VERSION_120 = 0x10020000,
  79. CAM_CPAS_VERSION_130 = 0x10030000,
  80. CAM_CPAS_VERSION_200 = 0x20000000,
  81. CAM_CPAS_VERSION_MAX
  82. };
  83. /**
  84. * enum cam_cpas_camera_version_map_id Enum for camera version map id
  85. * This enum is mapped with cam_cpas_camera_version
  86. */
  87. enum cam_cpas_camera_version_map_id {
  88. CAM_CPAS_CAMERA_VERSION_ID_150 = 0x0,
  89. CAM_CPAS_CAMERA_VERSION_ID_170 = 0x1,
  90. CAM_CPAS_CAMERA_VERSION_ID_175 = 0x2,
  91. CAM_CPAS_CAMERA_VERSION_ID_480 = 0x3,
  92. CAM_CPAS_CAMERA_VERSION_ID_580 = 0x4,
  93. CAM_CPAS_CAMERA_VERSION_ID_520 = 0x5,
  94. CAM_CPAS_CAMERA_VERSION_ID_540 = 0x6,
  95. CAM_CPAS_CAMERA_VERSION_ID_545 = 0x7,
  96. CAM_CPAS_CAMERA_VERSION_ID_570 = 0x8,
  97. CAM_CPAS_CAMERA_VERSION_ID_680 = 0x9,
  98. CAM_CPAS_CAMERA_VERSION_ID_165 = 0xA,
  99. CAM_CPAS_CAMERA_VERSION_ID_780 = 0xB,
  100. CAM_CPAS_CAMERA_VERSION_ID_640 = 0xC,
  101. CAM_CPAS_CAMERA_VERSION_ID_880 = 0xD,
  102. CAM_CPAS_CAMERA_VERSION_ID_MAX
  103. };
  104. /**
  105. * enum cam_cpas_version_map_id Enum for cpas version map id
  106. * This enum is mapped with cam_cpas_version
  107. */
  108. enum cam_cpas_version_map_id {
  109. CAM_CPAS_VERSION_ID_100 = 0x0,
  110. CAM_CPAS_VERSION_ID_101 = 0x1,
  111. CAM_CPAS_VERSION_ID_110 = 0x2,
  112. CAM_CPAS_VERSION_ID_120 = 0x3,
  113. CAM_CPAS_VERSION_ID_130 = 0x4,
  114. CAM_CPAS_VERSION_ID_200 = 0x5,
  115. CAM_CPAS_VERSION_ID_MAX
  116. };
  117. /**
  118. * enum cam_cpas_hw_version - Enum for Titan CPAS HW Versions
  119. */
  120. enum cam_cpas_hw_version {
  121. CAM_CPAS_TITAN_NONE = 0,
  122. CAM_CPAS_TITAN_150_V100 = 0x150100,
  123. CAM_CPAS_TITAN_165_V100 = 0x165100,
  124. CAM_CPAS_TITAN_170_V100 = 0x170100,
  125. CAM_CPAS_TITAN_170_V110 = 0x170110,
  126. CAM_CPAS_TITAN_170_V120 = 0x170120,
  127. CAM_CPAS_TITAN_170_V200 = 0x170200,
  128. CAM_CPAS_TITAN_175_V100 = 0x175100,
  129. CAM_CPAS_TITAN_175_V101 = 0x175101,
  130. CAM_CPAS_TITAN_175_V120 = 0x175120,
  131. CAM_CPAS_TITAN_175_V130 = 0x175130,
  132. CAM_CPAS_TITAN_480_V100 = 0x480100,
  133. CAM_CPAS_TITAN_580_V100 = 0x580100,
  134. CAM_CPAS_TITAN_540_V100 = 0x540100,
  135. CAM_CPAS_TITAN_520_V100 = 0x520100,
  136. CAM_CPAS_TITAN_545_V100 = 0x545100,
  137. CAM_CPAS_TITAN_570_V100 = 0x570100,
  138. CAM_CPAS_TITAN_570_V200 = 0x570200,
  139. CAM_CPAS_TITAN_680_V100 = 0x680100,
  140. CAM_CPAS_TITAN_680_V110 = 0x680110,
  141. CAM_CPAS_TITAN_780_V100 = 0x780100,
  142. CAM_CPAS_TITAN_640_V200 = 0x640200,
  143. CAM_CPAS_TITAN_880_V100 = 0x880100,
  144. CAM_CPAS_TITAN_MAX
  145. };
  146. /**
  147. * enum cam_camnoc_slave_error_codes - Enum for camnoc slave error codes
  148. *
  149. */
  150. enum cam_camnoc_slave_error_codes {
  151. CAM_CAMNOC_TARGET_ERROR,
  152. CAM_CAMNOC_ADDRESS_DECODE_ERROR,
  153. CAM_CAMNOC_UNSUPPORTED_REQUEST_ERROR,
  154. CAM_CAMNOC_DISCONNECTED_TARGET_ERROR,
  155. CAM_CAMNOC_SECURITY_VIOLATION,
  156. CAM_CAMNOC_HIDDEN_SECURITY_VIOLATION,
  157. CAM_CAMNOC_TIME_OUT,
  158. CAM_CAMNOC_UNUSED,
  159. };
  160. /**
  161. * enum cam_camnoc_irq_type - Enum for camnoc irq types
  162. *
  163. * @CAM_CAMNOC_IRQ_SLAVE_ERROR: Each slave port in CAMNOC (3 QSB ports and
  164. * 1 QHB port) has an error logger. The error
  165. * observed at any slave port is logged into
  166. * the error logger register and an IRQ is
  167. * triggered
  168. * @CAM_CAMNOC_IRQ_IFE_UBWC_ENCODE_ERROR : Triggered if any error detected
  169. * in the IFE UBWC encoder instance
  170. * @CAM_CAMNOC_IRQ_IFE_UBWC_STATS_ENCODE_ERROR: Triggered if any error detected
  171. * in the IFE UBWC-Stats encoder
  172. * instance
  173. * @CAM_CAMNOC_IRQ_IFE02_UBWC_ENCODE_ERROR : Triggered if any error detected
  174. * in the IFE0 UBWC encoder instance
  175. * @CAM_CAMNOC_IRQ_IFE13_UBWC_ENCODE_ERROR : Triggered if any error detected
  176. * in the IFE1 or IFE3 UBWC encoder
  177. * instance
  178. * @CAM_CAMNOC_IRQ_IFE0_UBWC_ENCODE_ERROR : Triggered if any error detected
  179. * in the IFE0 UBWC encoder instance
  180. * @CAM_CAMNOC_IRQ_IFE1_WR_UBWC_ENCODE_ERROR : Triggered if any error detected
  181. * in the IFE1 UBWC encoder
  182. * instance
  183. * @CAM_CAMNOC_IRQ_IPE_UBWC_ENCODE_ERROR : Triggered if any error detected
  184. * in the IPE write path encoder
  185. * instance
  186. * @CAM_CAMNOC_IRQ_BPS_UBWC_ENCODE_ERROR : Triggered if any error detected
  187. * in the BPS write path encoder
  188. * instance
  189. * @CAM_CAMNOC_IRQ_IPE1_BPS_UBWC_DECODE_ERROR: Triggered if any error detected
  190. * in the IPE1/BPS read path decoder
  191. * instance
  192. * @CAM_CAMNOC_IRQ_IPE0_UBWC_DECODE_ERROR : Triggered if any error detected
  193. * in the IPE0 read path decoder
  194. * instance
  195. * @CAM_CAMNOC_IRQ_IPE1_UBWC_DECODE_ERROR : Triggered if any error detected
  196. * in the IPE1 read path decoder
  197. * instance
  198. * @CAM_CAMNOC_IRQ_IPE_BPS_UBWC_DECODE_ERROR: Triggered if any error detected
  199. * in the IPE/BPS UBWC decoder
  200. * instance
  201. * @CAM_CAMNOC_IRQ_IPE_BPS_UBWC_ENCODE_ERROR: Triggered if any error detected
  202. * in the IPE/BPS UBWC encoder
  203. * instance
  204. * @CAM_CAMNOC_IRQ_OFE_WR_UBWC_DECODE_ERROR : Triggered if any error detected
  205. * in the OFE write UBWC decoder
  206. * instance
  207. * @CAM_CAMNOC_IRQ_OFE_RD_UBWC_DECODE_ERROR : Triggered if any error detected
  208. * in the OFE read UBWC decoder
  209. * instance
  210. * @CAM_CAMNOC_IRQ_AHB_TIMEOUT : Triggered when the QHS_ICP slave
  211. * times out after 4000 AHB cycles
  212. */
  213. enum cam_camnoc_irq_type {
  214. CAM_CAMNOC_IRQ_SLAVE_ERROR,
  215. CAM_CAMNOC_IRQ_IFE_UBWC_ENCODE_ERROR,
  216. CAM_CAMNOC_IRQ_IFE_UBWC_STATS_ENCODE_ERROR,
  217. CAM_CAMNOC_IRQ_IFE_UBWC_STATS_1_ENCODE_ERROR,
  218. CAM_CAMNOC_IRQ_IFE02_UBWC_ENCODE_ERROR,
  219. CAM_CAMNOC_IRQ_IFE13_UBWC_ENCODE_ERROR,
  220. CAM_CAMNOC_IRQ_IFE0_UBWC_ENCODE_ERROR,
  221. CAM_CAMNOC_IRQ_IFE1_WRITE_UBWC_ENCODE_ERROR,
  222. CAM_CAMNOC_IRQ_IPE_UBWC_ENCODE_ERROR,
  223. CAM_CAMNOC_IRQ_BPS_UBWC_ENCODE_ERROR,
  224. CAM_CAMNOC_IRQ_IPE1_BPS_UBWC_DECODE_ERROR,
  225. CAM_CAMNOC_IRQ_IPE0_UBWC_DECODE_ERROR,
  226. CAM_CAMNOC_IRQ_IPE1_UBWC_DECODE_ERROR,
  227. CAM_CAMNOC_IRQ_IPE_BPS_UBWC_DECODE_ERROR,
  228. CAM_CAMNOC_IRQ_IPE_BPS_UBWC_ENCODE_ERROR,
  229. CAM_CAMNOC_IRQ_OFE_WR_UBWC_DECODE_ERROR,
  230. CAM_CAMNOC_IRQ_OFE_RD_UBWC_DECODE_ERROR,
  231. CAM_CAMNOC_IRQ_AHB_TIMEOUT,
  232. };
  233. /**
  234. * enum cam_sys_cache_config_types - Enum for camera llc's
  235. */
  236. enum cam_sys_cache_config_types {
  237. CAM_LLCC_SMALL_1 = 0,
  238. CAM_LLCC_SMALL_2 = 1,
  239. CAM_LLCC_LARGE_1 = 2,
  240. CAM_LLCC_LARGE_2 = 3,
  241. CAM_LLCC_LARGE_3 = 4,
  242. CAM_LLCC_LARGE_4 = 5,
  243. CAM_LLCC_MAX = 6,
  244. };
  245. /**
  246. * struct cam_camnoc_irq_slave_err_data : Data for Slave error.
  247. *
  248. * @mainctrl : Err logger mainctrl info
  249. * @errvld : Err logger errvld info
  250. * @errlog0_low : Err logger errlog0_low info
  251. * @errlog0_high : Err logger errlog0_high info
  252. * @errlog1_low : Err logger errlog1_low info
  253. * @errlog1_high : Err logger errlog1_high info
  254. * @errlog2_low : Err logger errlog2_low info
  255. * @errlog2_high : Err logger errlog2_high info
  256. * @errlog3_low : Err logger errlog3_low info
  257. * @errlog3_high : Err logger errlog3_high info
  258. *
  259. */
  260. struct cam_camnoc_irq_slave_err_data {
  261. union {
  262. struct {
  263. uint32_t stall_en : 1; /* bit 0 */
  264. uint32_t fault_en : 1; /* bit 1 */
  265. uint32_t rsv : 30; /* bits 2-31 */
  266. };
  267. uint32_t value;
  268. } mainctrl;
  269. union {
  270. struct {
  271. uint32_t err_vld : 1; /* bit 0 */
  272. uint32_t rsv : 31; /* bits 1-31 */
  273. };
  274. uint32_t value;
  275. } errvld;
  276. union {
  277. struct {
  278. uint32_t loginfo_vld : 1; /* bit 0 */
  279. uint32_t word_error : 1; /* bit 1 */
  280. uint32_t non_secure : 1; /* bit 2 */
  281. uint32_t device : 1; /* bit 3 */
  282. uint32_t opc : 3; /* bits 4 - 6 */
  283. uint32_t rsv0 : 1; /* bit 7 */
  284. uint32_t err_code : 3; /* bits 8 - 10 */
  285. uint32_t sizef : 3; /* bits 11 - 13 */
  286. uint32_t rsv1 : 2; /* bits 14 - 15 */
  287. uint32_t addr_space : 6; /* bits 16 - 21 */
  288. uint32_t rsv2 : 10; /* bits 22 - 31 */
  289. };
  290. uint32_t value;
  291. } errlog0_low;
  292. union {
  293. struct {
  294. uint32_t len1 : 10; /* bits 0 - 9 */
  295. uint32_t rsv : 22; /* bits 10 - 31 */
  296. };
  297. uint32_t value;
  298. } errlog0_high;
  299. union {
  300. struct {
  301. uint32_t path : 16; /* bits 0 - 15 */
  302. uint32_t rsv : 16; /* bits 16 - 31 */
  303. };
  304. uint32_t value;
  305. } errlog1_low;
  306. union {
  307. struct {
  308. uint32_t extid : 18; /* bits 0 - 17 */
  309. uint32_t rsv : 14; /* bits 18 - 31 */
  310. };
  311. uint32_t value;
  312. } errlog1_high;
  313. union {
  314. struct {
  315. uint32_t errlog2_lsb : 32; /* bits 0 - 31 */
  316. };
  317. uint32_t value;
  318. } errlog2_low;
  319. union {
  320. struct {
  321. uint32_t errlog2_msb : 16; /* bits 0 - 16 */
  322. uint32_t rsv : 16; /* bits 16 - 31 */
  323. };
  324. uint32_t value;
  325. } errlog2_high;
  326. union {
  327. struct {
  328. uint32_t errlog3_lsb : 32; /* bits 0 - 31 */
  329. };
  330. uint32_t value;
  331. } errlog3_low;
  332. union {
  333. struct {
  334. uint32_t errlog3_msb : 32; /* bits 0 - 31 */
  335. };
  336. uint32_t value;
  337. } errlog3_high;
  338. };
  339. /**
  340. * struct cam_camnoc_irq_ubwc_enc_data : Data for UBWC Encode error.
  341. *
  342. * @encerr_status : Encode error status
  343. *
  344. */
  345. struct cam_camnoc_irq_ubwc_enc_data {
  346. union {
  347. struct {
  348. uint32_t encerrstatus : 3; /* bits 0 - 2 */
  349. uint32_t rsv : 29; /* bits 3 - 31 */
  350. };
  351. uint32_t value;
  352. } encerr_status;
  353. };
  354. /**
  355. * struct cam_camnoc_irq_ubwc_dec_data : Data for UBWC Decode error.
  356. *
  357. * @decerr_status : Decoder error status
  358. * @thr_err : Set to 1 if
  359. * At least one of the bflc_len fields in the bit steam exceeds
  360. * its threshold value. This error is possible only for
  361. * RGBA1010102, TP10, and RGB565 formats
  362. * @fcl_err : Set to 1 if
  363. * Fast clear with a legal non-RGB format
  364. * @len_md_err : Set to 1 if
  365. * The calculated burst length does not match burst length
  366. * specified by the metadata value
  367. * @format_err : Set to 1 if
  368. * Illegal format
  369. * 1. bad format :2,3,6
  370. * 2. For 32B MAL, metadata=6
  371. * 3. For 32B MAL RGB565, Metadata != 0,1,7
  372. * 4. For 64B MAL RGB565, metadata[3:1] == 1,2
  373. *
  374. */
  375. struct cam_camnoc_irq_ubwc_dec_data {
  376. union {
  377. struct {
  378. uint32_t thr_err : 1; /* bit 0 */
  379. uint32_t fcl_err : 1; /* bit 1 */
  380. uint32_t len_md_err : 1; /* bit 2 */
  381. uint32_t format_err : 1; /* bit 3 */
  382. uint32_t rsv : 28; /* bits 4 - 31 */
  383. };
  384. uint32_t value;
  385. } decerr_status;
  386. };
  387. struct cam_camnoc_irq_ahb_timeout_data {
  388. uint32_t data;
  389. };
  390. /**
  391. * struct cam_cpas_irq_data : CAMNOC IRQ data
  392. *
  393. * @irq_type : To identify the type of IRQ
  394. * @u : Union of irq err data information
  395. * @slave_err : Data for Slave error.
  396. * Valid if type is CAM_CAMNOC_IRQ_SLAVE_ERROR
  397. * @enc_err : Data for UBWC Encode error.
  398. * Valid if type is one of below:
  399. * CAM_CAMNOC_IRQ_IFE02_UBWC_ENCODE_ERROR
  400. * CAM_CAMNOC_IRQ_IFE13_UBWC_ENCODE_ERROR
  401. * CAM_CAMNOC_IRQ_IPE_BPS_UBWC_ENCODE_ERROR
  402. * @dec_err : Data for UBWC Decode error.
  403. * Valid if type is CAM_CAMNOC_IRQ_IPE_BPS_UBWC_DECODE_ERROR
  404. * @ahb_err : Data for Slave error.
  405. * Valid if type is CAM_CAMNOC_IRQ_AHB_TIMEOUT
  406. *
  407. */
  408. struct cam_cpas_irq_data {
  409. enum cam_camnoc_irq_type irq_type;
  410. union {
  411. struct cam_camnoc_irq_slave_err_data slave_err;
  412. struct cam_camnoc_irq_ubwc_enc_data enc_err;
  413. struct cam_camnoc_irq_ubwc_dec_data dec_err;
  414. struct cam_camnoc_irq_ahb_timeout_data ahb_err;
  415. } u;
  416. };
  417. /*
  418. * CPAS client callback
  419. *
  420. * @client_handle : CPAS client handle
  421. * @userdata : User data given at the time of register
  422. * @irq_data : Event data
  423. */
  424. typedef bool (*cam_cpas_client_cb_func)(
  425. uint32_t client_handle, void *userdata,
  426. struct cam_cpas_irq_data *irq_data);
  427. /**
  428. * struct cam_cpas_register_params : Register params for cpas client
  429. *
  430. * @identifier : Input identifier string which is the device label
  431. * from dt like vfe, ife, jpeg etc
  432. * @cell_index : Input integer identifier pointing to the cell index
  433. * from dt of the device. This can be used to form a
  434. * unique string with @identifier like vfe0, ife1,
  435. * jpeg0, etc
  436. * @dev : device handle
  437. * @userdata : Input private data which will be passed as
  438. * an argument while callback.
  439. * @cam_cpas_callback : Input callback pointer for triggering the
  440. * callbacks from CPAS driver.
  441. * @client_handle : Output Unique handle generated for this register
  442. *
  443. */
  444. struct cam_cpas_register_params {
  445. char identifier[CAM_HW_IDENTIFIER_LENGTH];
  446. uint32_t cell_index;
  447. struct device *dev;
  448. void *userdata;
  449. cam_cpas_client_cb_func cam_cpas_client_cb;
  450. uint32_t client_handle;
  451. };
  452. /**
  453. * enum cam_vote_type - Enum for voting type
  454. *
  455. * @CAM_VOTE_ABSOLUTE : Absolute vote
  456. * @CAM_VOTE_DYNAMIC : Dynamic vote
  457. */
  458. enum cam_vote_type {
  459. CAM_VOTE_ABSOLUTE,
  460. CAM_VOTE_DYNAMIC,
  461. };
  462. /**
  463. * struct cam_ahb_vote : AHB vote
  464. *
  465. * @type : AHB voting type.
  466. * CAM_VOTE_ABSOLUTE : vote based on the value 'level' is set
  467. * CAM_VOTE_DYNAMIC : vote calculated dynamically using 'freq'
  468. * and 'dev' handle is set
  469. * @level : AHB vote level
  470. * @freq : AHB vote dynamic frequency
  471. *
  472. */
  473. struct cam_ahb_vote {
  474. enum cam_vote_type type;
  475. union {
  476. enum cam_vote_level level;
  477. unsigned long freq;
  478. } vote;
  479. };
  480. /**
  481. * struct cam_cpas_axi_per_path_bw_vote - Internal per path bandwidth vote information
  482. *
  483. * @usage_data: client usage data (left/right/rdi)
  484. * @transac_type: Transaction type on the path (read/write)
  485. * @path_data_type: Path for which vote is given (video, display, rdi)
  486. * @vote_level: Vote level for this path
  487. * @camnoc_bw: CAMNOC bw for this path
  488. * @mnoc_ab_bw: MNOC AB bw for this path
  489. * @mnoc_ib_bw: MNOC IB bw for this path
  490. */
  491. struct cam_cpas_axi_per_path_bw_vote {
  492. uint32_t usage_data;
  493. uint32_t transac_type;
  494. uint32_t path_data_type;
  495. uint32_t vote_level;
  496. uint64_t camnoc_bw;
  497. uint64_t mnoc_ab_bw;
  498. uint64_t mnoc_ib_bw;
  499. };
  500. /**
  501. * struct cam_axi_vote : AXI vote
  502. *
  503. * @num_paths: Number of paths on which BW vote is sent to CPAS
  504. * @axi_path: Per path BW vote info
  505. *
  506. */
  507. struct cam_axi_vote {
  508. uint32_t num_paths;
  509. struct cam_cpas_axi_per_path_bw_vote axi_path[CAM_CPAS_MAX_PATHS_PER_CLIENT];
  510. };
  511. /**
  512. * cam_cpas_register_client()
  513. *
  514. * @brief: API to register cpas client
  515. *
  516. * @register_params: Input params to register as a client to CPAS
  517. *
  518. * @return 0 on success.
  519. *
  520. */
  521. int cam_cpas_register_client(
  522. struct cam_cpas_register_params *register_params);
  523. /**
  524. * cam_cpas_unregister_client()
  525. *
  526. * @brief: API to unregister cpas client
  527. *
  528. * @client_handle: Client handle to be unregistered
  529. *
  530. * @return 0 on success.
  531. *
  532. */
  533. int cam_cpas_unregister_client(uint32_t client_handle);
  534. /**
  535. * cam_cpas_start()
  536. *
  537. * @brief: API to start cpas client hw. Clients have to vote for minimal
  538. * bandwidth requirements for AHB, AXI. Use cam_cpas_update_ahb_vote
  539. * to scale bandwidth after start.
  540. *
  541. * @client_handle: client cpas handle
  542. * @ahb_vote : Pointer to ahb vote info
  543. * @axi_vote : Pointer to axi bandwidth vote info
  544. *
  545. * If AXI vote is not applicable to a particular client, use the value exposed
  546. * by CAM_CPAS_DEFAULT_AXI_BW as the default vote request.
  547. *
  548. * @return 0 on success.
  549. *
  550. */
  551. int cam_cpas_start(
  552. uint32_t client_handle,
  553. struct cam_ahb_vote *ahb_vote,
  554. struct cam_axi_vote *axi_vote);
  555. /**
  556. * cam_cpas_stop()
  557. *
  558. * @brief: API to stop cpas client hw. Bandwidth for AHB, AXI votes
  559. * would be removed for this client on this call. Clients should not
  560. * use cam_cpas_update_ahb_vote or cam_cpas_update_axi_vote
  561. * to remove their bandwidth vote.
  562. *
  563. * @client_handle: client cpas handle
  564. *
  565. * @return 0 on success.
  566. *
  567. */
  568. int cam_cpas_stop(uint32_t client_handle);
  569. /**
  570. * cam_cpas_update_ahb_vote()
  571. *
  572. * @brief: API to update AHB vote requirement. Use this function only
  573. * between cam_cpas_start and cam_cpas_stop in case clients wants
  574. * to scale to different vote level. Do not use this function to de-vote,
  575. * removing client's vote is implicit on cam_cpas_stop
  576. *
  577. * @client_handle : Client cpas handle
  578. * @ahb_vote : Pointer to ahb vote info
  579. *
  580. * @return 0 on success.
  581. *
  582. */
  583. int cam_cpas_update_ahb_vote(
  584. uint32_t client_handle,
  585. struct cam_ahb_vote *ahb_vote);
  586. /**
  587. * cam_cpas_update_axi_vote()
  588. *
  589. * @brief: API to update AXI vote requirement. Use this function only
  590. * between cam_cpas_start and cam_cpas_stop in case clients wants
  591. * to scale to different vote level. Do not use this function to de-vote,
  592. * removing client's vote is implicit on cam_cpas_stop
  593. *
  594. * @client_handle : Client cpas handle
  595. * @axi_vote : Pointer to axi bandwidth vote info
  596. *
  597. * @return 0 on success.
  598. *
  599. */
  600. int cam_cpas_update_axi_vote(
  601. uint32_t client_handle,
  602. struct cam_axi_vote *axi_vote);
  603. /**
  604. * cam_cpas_reg_write()
  605. *
  606. * @brief: API to write a register value in CPAS register space
  607. *
  608. * @client_handle : Client cpas handle
  609. * @reg_base : Register base identifier
  610. * @offset : Offset from the register base address
  611. * @mb : Whether to do reg write with memory barrier
  612. * @value : Value to be written in register
  613. *
  614. * @return 0 on success.
  615. *
  616. */
  617. int cam_cpas_reg_write(
  618. uint32_t client_handle,
  619. enum cam_cpas_reg_base reg_base,
  620. uint32_t offset,
  621. bool mb,
  622. uint32_t value);
  623. /**
  624. * cam_cpas_reg_read()
  625. *
  626. * @brief: API to read a register value from CPAS register space
  627. *
  628. * @client_handle : Client cpas handle
  629. * @reg_base : Register base identifier
  630. * @offset : Offset from the register base address
  631. * @mb : Whether to do reg read with memory barrier
  632. * @value : Value to be red from register
  633. *
  634. * @return 0 on success.
  635. *
  636. */
  637. int cam_cpas_reg_read(
  638. uint32_t client_handle,
  639. enum cam_cpas_reg_base reg_base,
  640. uint32_t offset,
  641. bool mb,
  642. uint32_t *value);
  643. /**
  644. * cam_cpas_get_hw_info()
  645. *
  646. * @brief: API to get camera hw information
  647. *
  648. * @camera_family : Camera family type. One of
  649. * CAM_FAMILY_CAMERA_SS
  650. * CAM_FAMILY_CPAS_SS
  651. * @camera_version : Camera platform version
  652. * @cpas_version : Camera cpas version
  653. * @cam_caps : Camera capability
  654. * @cam_fuse_info : Camera fuse info
  655. *
  656. * @return 0 on success.
  657. *
  658. */
  659. int cam_cpas_get_hw_info(
  660. uint32_t *camera_family,
  661. struct cam_hw_version *camera_version,
  662. struct cam_hw_version *cpas_version,
  663. uint32_t *cam_caps,
  664. struct cam_cpas_fuse_info *cam_fuse_info);
  665. /**
  666. * cam_cpas_get_cpas_hw_version()
  667. *
  668. * @brief: API to get camera cpas hw version
  669. *
  670. * @hw_version : Camera cpas hw version
  671. *
  672. * @return 0 on success.
  673. *
  674. */
  675. int cam_cpas_get_cpas_hw_version(
  676. uint32_t *hw_version);
  677. /**
  678. * cam_cpas_is_feature_supported()
  679. *
  680. * @brief: API to get camera features
  681. *
  682. * @flag : Camera hw features to check
  683. *
  684. * @hw_map : To indicate which HWs are supported
  685. *
  686. * @fule_val : Return fule value in case of value type feature
  687. *
  688. * @return 1 if feature is supported
  689. *
  690. */
  691. bool cam_cpas_is_feature_supported(uint32_t flag, uint32_t hw_map,
  692. uint32_t *fuse_val);
  693. /**
  694. * cam_cpas_axi_util_path_type_to_string()
  695. *
  696. * @brief: API to get string for given path type
  697. *
  698. * @path_data_type : Path type
  699. *
  700. * @return string.
  701. *
  702. */
  703. const char *cam_cpas_axi_util_path_type_to_string(
  704. uint32_t path_data_type);
  705. /**
  706. * cam_cpas_axi_util_trans_type_to_string()
  707. *
  708. * @brief: API to get string for given transaction type
  709. *
  710. * @path_data_type : Transaction type
  711. *
  712. * @return string.
  713. *
  714. */
  715. const char *cam_cpas_axi_util_trans_type_to_string(
  716. uint32_t path_data_type);
  717. /**
  718. * cam_cpas_axi_util_drv_vote_lvl_to_string()
  719. *
  720. * @brief: API to get string for given DRV vote level
  721. *
  722. * @vote_lvl : DRV vote level
  723. *
  724. * @return string.
  725. *
  726. */
  727. const char *cam_cpas_axi_util_drv_vote_lvl_to_string(
  728. uint32_t vote_lvl);
  729. /**
  730. * cam_cpas_log_votes()
  731. *
  732. * @brief: API to print the all bw votes of axi client. It also print the
  733. * applied camnoc axi clock vote value and ahb vote value
  734. *
  735. * @ddr_only: Print only DDR info
  736. *
  737. * @return 0 on success.
  738. *
  739. */
  740. void cam_cpas_log_votes(bool ddr_only);
  741. /**
  742. * cam_cpas_select_qos_settings()
  743. *
  744. * @brief: API to select specific qos settings based on usecase requirements
  745. *
  746. * @return 0 on success.
  747. *
  748. */
  749. int cam_cpas_select_qos_settings(uint32_t selection_mask);
  750. /**
  751. * cam_cpas_notify_event()
  752. *
  753. * @brief: API that clients can notify about their events. CPAS save the event
  754. * and any other useful information related to this event. This will
  755. * be printed while cpas state dump - cam_cpas_log_votes.
  756. * One such example is IFE notifiying SOF or EPOCH to cpas and cpas
  757. * saving axi clock information (camnoc_axi, mnoc_hf) at that point
  758. * and printing latest history on IFE overflow.
  759. *
  760. * @identifier_string: Identifier string passed by caller
  761. * @identifier_value: Identifier value passed by caller
  762. *
  763. * @return 0 on success.
  764. *
  765. */
  766. int cam_cpas_notify_event(const char *identifier_string,
  767. int32_t identifier_value);
  768. /**
  769. * cam_cpas_get_scid()
  770. *
  771. * @brief: API to obtain slice id for the given type
  772. *
  773. * @type: Cache type
  774. *
  775. * @return slice id, -1 for invalid id.
  776. *
  777. */
  778. int cam_cpas_get_scid(enum cam_sys_cache_config_types type);
  779. /**
  780. * cam_cpas_activate_llcc()
  781. *
  782. * @brief: API to activate system cache
  783. *
  784. * @type: Cache type
  785. *
  786. * @return 0 for success.
  787. *
  788. */
  789. int cam_cpas_activate_llcc(enum cam_sys_cache_config_types type);
  790. /**
  791. * cam_cpas_deactivate_llcc()
  792. *
  793. * @brief: API to de-activate system cache
  794. *
  795. * @type: Cache type
  796. *
  797. * @return 0 for success.
  798. *
  799. */
  800. int cam_cpas_deactivate_llcc(enum cam_sys_cache_config_types type);
  801. /**
  802. * cam_cpas_dump_camnoc_buff_fill_info()
  803. *
  804. * @brief: API to dump camnoc buffer fill level info
  805. *
  806. * @client_handle : Client cpas handle
  807. *
  808. * @return 0 on success
  809. *
  810. */
  811. int cam_cpas_dump_camnoc_buff_fill_info(uint32_t client_handle);
  812. /**
  813. * cam_cpas_csid_input_core_info_update()
  814. *
  815. * @brief: API to communicate csid input core info to cpas
  816. *
  817. * @csid_idx: csid hw index connected to particular sfe
  818. * @sfe_idx: sfe idx to be connected to particular DRV path
  819. * @set_port: Indicates whether to set or reset DRV port info in dynamic client
  820. *
  821. * @return 0 on success
  822. *
  823. */
  824. int cam_cpas_csid_input_core_info_update(int csid_idx, int sfe_idx, bool set_port);
  825. /**
  826. * cam_cpas_csid_process_resume()
  827. *
  828. * @brief: API to process csid resume in cpas
  829. * @csid_idx: CSID idx to notify resume for
  830. *
  831. * @return 0 on success
  832. *
  833. */
  834. int cam_cpas_csid_process_resume(uint32_t csid_idx);
  835. /**
  836. * cam_cpas_query_drv_enable()
  837. *
  838. * @brief: API to indicate DRV enabled on hw or not
  839. * @is_drv_enabled: Indication to be set by the API
  840. *
  841. * @return 0 on success
  842. *
  843. */
  844. int cam_cpas_query_drv_enable(bool *is_drv_enabled);
  845. /**
  846. * cam_cpas_query_domain_id_security_support()
  847. * @brief: API to determine if target supports domain id feature
  848. * This information is determined by cpas during probe
  849. *
  850. * @return true if there's support, false otherwise
  851. */
  852. bool cam_cpas_query_domain_id_security_support(void);
  853. #endif /* _CAM_CPAS_API_H_ */