sde_rotator_base.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2012, 2015-2019, The Linux Foundation. All rights reserved.
  4. */
  5. #define pr_fmt(fmt) "%s: " fmt, __func__
  6. #include <linux/errno.h>
  7. #include <linux/file.h>
  8. #include <linux/spinlock.h>
  9. #include <linux/types.h>
  10. #include <linux/major.h>
  11. #include <linux/debugfs.h>
  12. #include <linux/clk.h>
  13. #include <linux/slab.h>
  14. #include <linux/io.h>
  15. #include <linux/iopoll.h>
  16. #include <linux/msm-bus.h>
  17. #include <linux/msm-bus-board.h>
  18. #include <linux/regulator/consumer.h>
  19. #define CREATE_TRACE_POINTS
  20. #include "sde_rotator_base.h"
  21. #include "sde_rotator_util.h"
  22. #include "sde_rotator_trace.h"
  23. #include "sde_rotator_debug.h"
  24. #include "sde_rotator_dev.h"
  25. static inline u64 fudge_factor(u64 val, u32 numer, u32 denom)
  26. {
  27. u64 result = (val * (u64)numer);
  28. do_div(result, denom);
  29. return result;
  30. }
  31. static inline u64 apply_fudge_factor(u64 val,
  32. struct sde_mult_factor *factor)
  33. {
  34. return fudge_factor(val, factor->numer, factor->denom);
  35. }
  36. static inline u64 apply_inverse_fudge_factor(u64 val,
  37. struct sde_mult_factor *factor)
  38. {
  39. return fudge_factor(val, factor->denom, factor->numer);
  40. }
  41. static inline bool validate_comp_ratio(struct sde_mult_factor *factor)
  42. {
  43. return factor->numer && factor->denom;
  44. }
  45. u32 sde_apply_comp_ratio_factor(u32 quota,
  46. struct sde_mdp_format_params *fmt,
  47. struct sde_mult_factor *factor)
  48. {
  49. struct sde_rot_data_type *mdata = sde_rot_get_mdata();
  50. if (!mdata || !test_bit(SDE_QOS_OVERHEAD_FACTOR,
  51. mdata->sde_qos_map))
  52. return quota;
  53. /* apply compression ratio, only for compressed formats */
  54. if (sde_mdp_is_ubwc_format(fmt) &&
  55. validate_comp_ratio(factor))
  56. quota = apply_inverse_fudge_factor(quota, factor);
  57. return quota;
  58. }
  59. #define RES_1080p (1088*1920)
  60. #define RES_UHD (3840*2160)
  61. #define XIN_HALT_TIMEOUT_US 0x4000
  62. static int sde_mdp_wait_for_xin_halt(u32 xin_id)
  63. {
  64. void __iomem *vbif_base;
  65. u32 status;
  66. struct sde_rot_data_type *mdata = sde_rot_get_mdata();
  67. u32 idle_mask = BIT(xin_id);
  68. int rc;
  69. vbif_base = mdata->vbif_nrt_io.base;
  70. rc = readl_poll_timeout(vbif_base + MMSS_VBIF_XIN_HALT_CTRL1,
  71. status, (status & idle_mask),
  72. 1000, XIN_HALT_TIMEOUT_US);
  73. if (rc == -ETIMEDOUT) {
  74. SDEROT_ERR("VBIF client %d not halting. TIMEDOUT.\n",
  75. xin_id);
  76. } else {
  77. SDEROT_DBG("VBIF client %d is halted\n", xin_id);
  78. }
  79. return rc;
  80. }
  81. /**
  82. * force_on_xin_clk() - enable/disable the force-on for the pipe clock
  83. * @bit_off: offset of the bit to enable/disable the force-on.
  84. * @reg_off: register offset for the clock control.
  85. * @enable: boolean to indicate if the force-on of the clock needs to be
  86. * enabled or disabled.
  87. *
  88. * This function returns:
  89. * true - if the clock is forced-on by this function
  90. * false - if the clock was already forced on
  91. * It is the caller responsibility to check if this function is forcing
  92. * the clock on; if so, it will need to remove the force of the clock,
  93. * otherwise it should avoid to remove the force-on.
  94. * Clocks must be on when calling this function.
  95. */
  96. static bool force_on_xin_clk(u32 bit_off, u32 clk_ctl_reg_off, bool enable)
  97. {
  98. u32 val;
  99. u32 force_on_mask;
  100. struct sde_rot_data_type *mdata = sde_rot_get_mdata();
  101. bool clk_forced_on = false;
  102. force_on_mask = BIT(bit_off);
  103. val = readl_relaxed(mdata->mdp_base + clk_ctl_reg_off);
  104. clk_forced_on = !(force_on_mask & val);
  105. if (enable)
  106. val |= force_on_mask;
  107. else
  108. val &= ~force_on_mask;
  109. writel_relaxed(val, mdata->mdp_base + clk_ctl_reg_off);
  110. return clk_forced_on;
  111. }
  112. void sde_mdp_halt_vbif_xin(struct sde_mdp_vbif_halt_params *params)
  113. {
  114. struct sde_rot_data_type *mdata = sde_rot_get_mdata();
  115. u32 reg_val;
  116. bool forced_on;
  117. if (!mdata || !params || !params->reg_off_mdp_clk_ctrl) {
  118. SDEROT_ERR("null input parameter\n");
  119. return;
  120. }
  121. if (params->xin_id > MMSS_VBIF_NRT_VBIF_CLK_FORCE_CTRL0_XIN1) {
  122. SDEROT_ERR("xin_id:%d exceed max limit\n", params->xin_id);
  123. return;
  124. }
  125. forced_on = force_on_xin_clk(params->bit_off_mdp_clk_ctrl,
  126. params->reg_off_mdp_clk_ctrl, true);
  127. SDEROT_EVTLOG(forced_on, params->xin_id);
  128. reg_val = SDE_VBIF_READ(mdata, MMSS_VBIF_XIN_HALT_CTRL0);
  129. SDE_VBIF_WRITE(mdata, MMSS_VBIF_XIN_HALT_CTRL0,
  130. reg_val | BIT(params->xin_id));
  131. /* this is a polling operation */
  132. sde_mdp_wait_for_xin_halt(params->xin_id);
  133. reg_val = SDE_VBIF_READ(mdata, MMSS_VBIF_XIN_HALT_CTRL0);
  134. SDE_VBIF_WRITE(mdata, MMSS_VBIF_XIN_HALT_CTRL0,
  135. reg_val & ~BIT(params->xin_id));
  136. if (forced_on)
  137. force_on_xin_clk(params->bit_off_mdp_clk_ctrl,
  138. params->reg_off_mdp_clk_ctrl, false);
  139. }
  140. u32 sde_mdp_get_ot_limit(u32 width, u32 height, u32 pixfmt, u32 fps, u32 is_rd)
  141. {
  142. struct sde_rot_data_type *mdata = sde_rot_get_mdata();
  143. struct sde_mdp_format_params *fmt;
  144. u32 ot_lim;
  145. u32 is_yuv;
  146. u64 res;
  147. ot_lim = (is_rd) ? mdata->default_ot_rd_limit :
  148. mdata->default_ot_wr_limit;
  149. /*
  150. * If default ot is not set from dt,
  151. * then do not configure it.
  152. */
  153. if (ot_lim == 0)
  154. goto exit;
  155. /* Modify the limits if the target and the use case requires it */
  156. if (false == test_bit(SDE_QOS_OTLIM, mdata->sde_qos_map))
  157. goto exit;
  158. width = min_t(u32, width, SDE_ROT_MAX_IMG_WIDTH);
  159. height = min_t(u32, height, SDE_ROT_MAX_IMG_HEIGHT);
  160. res = width * height;
  161. res = res * fps;
  162. fmt = sde_get_format_params(pixfmt);
  163. if (!fmt) {
  164. SDEROT_WARN("invalid format %8.8x\n", pixfmt);
  165. goto exit;
  166. }
  167. is_yuv = sde_mdp_is_yuv_format(fmt);
  168. SDEROT_DBG("w:%d h:%d fps:%d pixfmt:%8.8x yuv:%d res:%llu rd:%d\n",
  169. width, height, fps, pixfmt, is_yuv, res, is_rd);
  170. if (!is_yuv)
  171. goto exit;
  172. /*
  173. * If (total_source_pixels <= 62208000 && YUV) -> RD/WROT=2 //1080p30
  174. * If (total_source_pixels <= 124416000 && YUV) -> RD/WROT=4 //1080p60
  175. * If (total_source_pixels <= 2160p && YUV && FPS <= 30) -> RD/WROT = 32
  176. */
  177. if (res <= (RES_1080p * 30))
  178. ot_lim = 2;
  179. else if (res <= (RES_1080p * 60))
  180. ot_lim = 4;
  181. exit:
  182. SDEROT_DBG("ot_lim=%d\n", ot_lim);
  183. return ot_lim;
  184. }
  185. static u32 get_ot_limit(u32 reg_off, u32 bit_off,
  186. struct sde_mdp_set_ot_params *params)
  187. {
  188. struct sde_rot_data_type *mdata = sde_rot_get_mdata();
  189. u32 ot_lim;
  190. u32 val;
  191. ot_lim = sde_mdp_get_ot_limit(
  192. params->width, params->height,
  193. params->fmt, params->fps,
  194. params->reg_off_vbif_lim_conf == MMSS_VBIF_RD_LIM_CONF);
  195. /*
  196. * If default ot is not set from dt,
  197. * then do not configure it.
  198. */
  199. if (ot_lim == 0)
  200. goto exit;
  201. val = SDE_VBIF_READ(mdata, reg_off);
  202. val &= (0xFF << bit_off);
  203. val = val >> bit_off;
  204. SDEROT_EVTLOG(val, ot_lim);
  205. if (val == ot_lim)
  206. ot_lim = 0;
  207. exit:
  208. SDEROT_DBG("ot_lim=%d\n", ot_lim);
  209. SDEROT_EVTLOG(params->width, params->height, params->fmt, params->fps,
  210. ot_lim);
  211. return ot_lim;
  212. }
  213. void sde_mdp_set_ot_limit(struct sde_mdp_set_ot_params *params)
  214. {
  215. struct sde_rot_data_type *mdata = sde_rot_get_mdata();
  216. u32 ot_lim;
  217. u32 reg_off_vbif_lim_conf = ((params->xin_id / mdata->npriority_lvl)
  218. * mdata->npriority_lvl)
  219. + params->reg_off_vbif_lim_conf;
  220. u32 bit_off_vbif_lim_conf = (params->xin_id % mdata->npriority_lvl) * 8;
  221. u32 reg_val;
  222. u32 sts;
  223. bool forced_on;
  224. ot_lim = get_ot_limit(
  225. reg_off_vbif_lim_conf,
  226. bit_off_vbif_lim_conf,
  227. params) & 0xFF;
  228. if (ot_lim == 0)
  229. goto exit;
  230. if (params->rotsts_base && params->rotsts_busy_mask) {
  231. sts = readl_relaxed(params->rotsts_base);
  232. if (sts & params->rotsts_busy_mask) {
  233. SDEROT_ERR(
  234. "Rotator still busy, should not modify VBIF\n");
  235. SDEROT_EVTLOG_TOUT_HANDLER(
  236. "rot", "vbif_dbg_bus", "panic");
  237. }
  238. }
  239. trace_rot_perf_set_ot(params->num, params->xin_id, ot_lim);
  240. forced_on = force_on_xin_clk(params->bit_off_mdp_clk_ctrl,
  241. params->reg_off_mdp_clk_ctrl, true);
  242. reg_val = SDE_VBIF_READ(mdata, reg_off_vbif_lim_conf);
  243. reg_val &= ~(0xFF << bit_off_vbif_lim_conf);
  244. reg_val |= (ot_lim) << bit_off_vbif_lim_conf;
  245. SDE_VBIF_WRITE(mdata, reg_off_vbif_lim_conf, reg_val);
  246. reg_val = SDE_VBIF_READ(mdata, MMSS_VBIF_XIN_HALT_CTRL0);
  247. SDE_VBIF_WRITE(mdata, MMSS_VBIF_XIN_HALT_CTRL0,
  248. reg_val | BIT(params->xin_id));
  249. /* this is a polling operation */
  250. sde_mdp_wait_for_xin_halt(params->xin_id);
  251. reg_val = SDE_VBIF_READ(mdata, MMSS_VBIF_XIN_HALT_CTRL0);
  252. SDE_VBIF_WRITE(mdata, MMSS_VBIF_XIN_HALT_CTRL0,
  253. reg_val & ~BIT(params->xin_id));
  254. if (forced_on)
  255. force_on_xin_clk(params->bit_off_mdp_clk_ctrl,
  256. params->reg_off_mdp_clk_ctrl, false);
  257. SDEROT_EVTLOG(params->num, params->xin_id, ot_lim);
  258. exit:
  259. return;
  260. }
  261. /*
  262. * sde_mdp_set_vbif_memtype - set memtype output for the given xin port
  263. * @mdata: pointer to global rotator data
  264. * @xin_id: xin identifier
  265. * @memtype: memtype output configuration
  266. * return: none
  267. */
  268. static void sde_mdp_set_vbif_memtype(struct sde_rot_data_type *mdata,
  269. u32 xin_id, u32 memtype)
  270. {
  271. u32 reg_off;
  272. u32 bit_off;
  273. u32 reg_val;
  274. /*
  275. * Assume 4 bits per bit field, 8 fields per 32-bit register.
  276. */
  277. if (xin_id >= 8)
  278. return;
  279. reg_off = MMSS_VBIF_NRT_VBIF_OUT_AXI_AMEMTYPE_CONF0;
  280. bit_off = (xin_id & 0x7) * 4;
  281. reg_val = SDE_VBIF_READ(mdata, reg_off);
  282. reg_val &= ~(0x7 << bit_off);
  283. reg_val |= (memtype & 0x7) << bit_off;
  284. SDE_VBIF_WRITE(mdata, reg_off, reg_val);
  285. }
  286. /*
  287. * sde_mdp_init_vbif - initialize static vbif configuration
  288. * return: 0 if success; error code otherwise
  289. */
  290. int sde_mdp_init_vbif(void)
  291. {
  292. struct sde_rot_data_type *mdata = sde_rot_get_mdata();
  293. int i;
  294. if (!mdata)
  295. return -EINVAL;
  296. if (mdata->vbif_memtype_count && mdata->vbif_memtype) {
  297. for (i = 0; i < mdata->vbif_memtype_count; i++)
  298. sde_mdp_set_vbif_memtype(mdata, i,
  299. mdata->vbif_memtype[i]);
  300. SDEROT_DBG("amemtype=0x%x\n", SDE_VBIF_READ(mdata,
  301. MMSS_VBIF_NRT_VBIF_OUT_AXI_AMEMTYPE_CONF0));
  302. }
  303. return 0;
  304. }
  305. struct reg_bus_client *sde_reg_bus_vote_client_create(char *client_name)
  306. {
  307. struct reg_bus_client *client;
  308. struct sde_rot_data_type *sde_res = sde_rot_get_mdata();
  309. static u32 id;
  310. if (client_name == NULL) {
  311. SDEROT_ERR("client name is null\n");
  312. return ERR_PTR(-EINVAL);
  313. }
  314. client = kzalloc(sizeof(struct reg_bus_client), GFP_KERNEL);
  315. if (!client)
  316. return ERR_PTR(-ENOMEM);
  317. mutex_lock(&sde_res->reg_bus_lock);
  318. strlcpy(client->name, client_name, MAX_CLIENT_NAME_LEN);
  319. client->usecase_ndx = VOTE_INDEX_DISABLE;
  320. client->id = id;
  321. SDEROT_DBG("bus vote client %s created:%pK id :%d\n", client_name,
  322. client, id);
  323. id++;
  324. list_add(&client->list, &sde_res->reg_bus_clist);
  325. mutex_unlock(&sde_res->reg_bus_lock);
  326. return client;
  327. }
  328. void sde_reg_bus_vote_client_destroy(struct reg_bus_client *client)
  329. {
  330. struct sde_rot_data_type *sde_res = sde_rot_get_mdata();
  331. if (!client) {
  332. SDEROT_ERR("reg bus vote: invalid client handle\n");
  333. } else {
  334. SDEROT_DBG("bus vote client %s destroyed:%pK id:%u\n",
  335. client->name, client, client->id);
  336. mutex_lock(&sde_res->reg_bus_lock);
  337. list_del_init(&client->list);
  338. mutex_unlock(&sde_res->reg_bus_lock);
  339. kfree(client);
  340. }
  341. }
  342. int sde_update_reg_bus_vote(struct reg_bus_client *bus_client, u32 usecase_ndx)
  343. {
  344. int ret = 0;
  345. bool changed = false;
  346. u32 max_usecase_ndx = VOTE_INDEX_DISABLE;
  347. struct reg_bus_client *client, *temp_client;
  348. struct sde_rot_data_type *sde_res = sde_rot_get_mdata();
  349. if (!sde_res || !sde_res->reg_bus_hdl || !bus_client)
  350. return 0;
  351. mutex_lock(&sde_res->reg_bus_lock);
  352. bus_client->usecase_ndx = usecase_ndx;
  353. list_for_each_entry_safe(client, temp_client, &sde_res->reg_bus_clist,
  354. list) {
  355. if (client->usecase_ndx < VOTE_INDEX_MAX &&
  356. client->usecase_ndx > max_usecase_ndx)
  357. max_usecase_ndx = client->usecase_ndx;
  358. }
  359. if (sde_res->reg_bus_usecase_ndx != max_usecase_ndx) {
  360. changed = true;
  361. sde_res->reg_bus_usecase_ndx = max_usecase_ndx;
  362. }
  363. SDEROT_DBG(
  364. "%pS: changed=%d current idx=%d request client %s id:%u idx:%d\n",
  365. __builtin_return_address(0), changed, max_usecase_ndx,
  366. bus_client->name, bus_client->id, usecase_ndx);
  367. if (changed)
  368. ret = msm_bus_scale_client_update_request(sde_res->reg_bus_hdl,
  369. max_usecase_ndx);
  370. mutex_unlock(&sde_res->reg_bus_lock);
  371. return ret;
  372. }
  373. static int sde_mdp_parse_dt_handler(struct platform_device *pdev,
  374. char *prop_name, u32 *offsets, int len)
  375. {
  376. int rc;
  377. rc = of_property_read_u32_array(pdev->dev.of_node, prop_name,
  378. offsets, len);
  379. if (rc) {
  380. SDEROT_ERR("Error from prop %s : u32 array read\n", prop_name);
  381. return -EINVAL;
  382. }
  383. return 0;
  384. }
  385. static int sde_mdp_parse_dt_prop_len(struct platform_device *pdev,
  386. char *prop_name)
  387. {
  388. int len = 0;
  389. of_find_property(pdev->dev.of_node, prop_name, &len);
  390. if (len < 1) {
  391. SDEROT_INFO("prop %s : doesn't exist in device tree\n",
  392. prop_name);
  393. return 0;
  394. }
  395. len = len/sizeof(u32);
  396. return len;
  397. }
  398. static void sde_mdp_parse_vbif_memtype(struct platform_device *pdev,
  399. struct sde_rot_data_type *mdata)
  400. {
  401. int rc;
  402. mdata->vbif_memtype_count = sde_mdp_parse_dt_prop_len(pdev,
  403. "qcom,mdss-rot-vbif-memtype");
  404. mdata->vbif_memtype = kcalloc(mdata->vbif_memtype_count,
  405. sizeof(u32), GFP_KERNEL);
  406. if (!mdata->vbif_memtype) {
  407. mdata->vbif_memtype_count = 0;
  408. return;
  409. }
  410. rc = sde_mdp_parse_dt_handler(pdev,
  411. "qcom,mdss-rot-vbif-memtype", mdata->vbif_memtype,
  412. mdata->vbif_memtype_count);
  413. if (rc) {
  414. SDEROT_DBG("vbif memtype not found\n");
  415. kfree(mdata->vbif_memtype);
  416. mdata->vbif_memtype = NULL;
  417. mdata->vbif_memtype_count = 0;
  418. return;
  419. }
  420. }
  421. static void sde_mdp_parse_vbif_qos(struct platform_device *pdev,
  422. struct sde_rot_data_type *mdata)
  423. {
  424. int rc;
  425. mdata->vbif_rt_qos = NULL;
  426. mdata->npriority_lvl = sde_mdp_parse_dt_prop_len(pdev,
  427. "qcom,mdss-rot-vbif-qos-setting");
  428. mdata->vbif_nrt_qos = kcalloc(mdata->npriority_lvl,
  429. sizeof(u32), GFP_KERNEL);
  430. if (!mdata->vbif_nrt_qos) {
  431. mdata->npriority_lvl = 0;
  432. return;
  433. }
  434. rc = sde_mdp_parse_dt_handler(pdev,
  435. "qcom,mdss-rot-vbif-qos-setting", mdata->vbif_nrt_qos,
  436. mdata->npriority_lvl);
  437. if (rc) {
  438. SDEROT_DBG("vbif setting not found\n");
  439. kfree(mdata->vbif_nrt_qos);
  440. mdata->vbif_nrt_qos = NULL;
  441. mdata->npriority_lvl = 0;
  442. return;
  443. }
  444. }
  445. static void sde_mdp_parse_cdp_setting(struct platform_device *pdev,
  446. struct sde_rot_data_type *mdata)
  447. {
  448. int rc;
  449. u32 len, data[SDE_ROT_OP_MAX] = {0};
  450. len = sde_mdp_parse_dt_prop_len(pdev,
  451. "qcom,mdss-rot-cdp-setting");
  452. if (len == SDE_ROT_OP_MAX) {
  453. rc = sde_mdp_parse_dt_handler(pdev,
  454. "qcom,mdss-rot-cdp-setting", data, len);
  455. if (rc) {
  456. SDEROT_ERR("invalid CDP setting\n");
  457. goto end;
  458. }
  459. set_bit(SDE_QOS_CDP, mdata->sde_qos_map);
  460. mdata->enable_cdp[SDE_ROT_RD] = data[SDE_ROT_RD];
  461. mdata->enable_cdp[SDE_ROT_WR] = data[SDE_ROT_WR];
  462. return;
  463. }
  464. end:
  465. clear_bit(SDE_QOS_CDP, mdata->sde_qos_map);
  466. }
  467. static void sde_mdp_parse_rot_lut_setting(struct platform_device *pdev,
  468. struct sde_rot_data_type *mdata)
  469. {
  470. int rc;
  471. u32 len, data[4];
  472. len = sde_mdp_parse_dt_prop_len(pdev, "qcom,mdss-rot-qos-lut");
  473. if (len == 4) {
  474. rc = sde_mdp_parse_dt_handler(pdev,
  475. "qcom,mdss-rot-qos-lut", data, len);
  476. if (!rc) {
  477. mdata->lut_cfg[SDE_ROT_RD].creq_lut_0 = data[0];
  478. mdata->lut_cfg[SDE_ROT_RD].creq_lut_1 = data[1];
  479. mdata->lut_cfg[SDE_ROT_WR].creq_lut_0 = data[2];
  480. mdata->lut_cfg[SDE_ROT_WR].creq_lut_1 = data[3];
  481. set_bit(SDE_QOS_LUT, mdata->sde_qos_map);
  482. } else {
  483. SDEROT_DBG("qos lut setting not found\n");
  484. }
  485. }
  486. len = sde_mdp_parse_dt_prop_len(pdev, "qcom,mdss-rot-danger-lut");
  487. if (len == SDE_ROT_OP_MAX) {
  488. rc = sde_mdp_parse_dt_handler(pdev,
  489. "qcom,mdss-rot-danger-lut", data, len);
  490. if (!rc) {
  491. mdata->lut_cfg[SDE_ROT_RD].danger_lut
  492. = data[SDE_ROT_RD];
  493. mdata->lut_cfg[SDE_ROT_WR].danger_lut
  494. = data[SDE_ROT_WR];
  495. set_bit(SDE_QOS_DANGER_LUT, mdata->sde_qos_map);
  496. } else {
  497. SDEROT_DBG("danger lut setting not found\n");
  498. }
  499. }
  500. len = sde_mdp_parse_dt_prop_len(pdev, "qcom,mdss-rot-safe-lut");
  501. if (len == SDE_ROT_OP_MAX) {
  502. rc = sde_mdp_parse_dt_handler(pdev,
  503. "qcom,mdss-rot-safe-lut", data, len);
  504. if (!rc) {
  505. mdata->lut_cfg[SDE_ROT_RD].safe_lut = data[SDE_ROT_RD];
  506. mdata->lut_cfg[SDE_ROT_WR].safe_lut = data[SDE_ROT_WR];
  507. set_bit(SDE_QOS_SAFE_LUT, mdata->sde_qos_map);
  508. } else {
  509. SDEROT_DBG("safe lut setting not found\n");
  510. }
  511. }
  512. }
  513. static void sde_mdp_parse_inline_rot_lut_setting(struct platform_device *pdev,
  514. struct sde_rot_data_type *mdata)
  515. {
  516. int rc;
  517. u32 len, data[4];
  518. len = sde_mdp_parse_dt_prop_len(pdev, "qcom,mdss-inline-rot-qos-lut");
  519. if (len == 4) {
  520. rc = sde_mdp_parse_dt_handler(pdev,
  521. "qcom,mdss-inline-rot-qos-lut", data, len);
  522. if (!rc) {
  523. mdata->inline_lut_cfg[SDE_ROT_RD].creq_lut_0 = data[0];
  524. mdata->inline_lut_cfg[SDE_ROT_RD].creq_lut_1 = data[1];
  525. mdata->inline_lut_cfg[SDE_ROT_WR].creq_lut_0 = data[2];
  526. mdata->inline_lut_cfg[SDE_ROT_WR].creq_lut_1 = data[3];
  527. set_bit(SDE_INLINE_QOS_LUT, mdata->sde_inline_qos_map);
  528. } else {
  529. SDEROT_DBG("inline qos lut setting not found\n");
  530. }
  531. }
  532. len = sde_mdp_parse_dt_prop_len(pdev,
  533. "qcom,mdss-inline-rot-danger-lut");
  534. if (len == SDE_ROT_OP_MAX) {
  535. rc = sde_mdp_parse_dt_handler(pdev,
  536. "qcom,mdss-inline-rot-danger-lut", data, len);
  537. if (!rc) {
  538. mdata->inline_lut_cfg[SDE_ROT_RD].danger_lut
  539. = data[SDE_ROT_RD];
  540. mdata->inline_lut_cfg[SDE_ROT_WR].danger_lut
  541. = data[SDE_ROT_WR];
  542. set_bit(SDE_INLINE_QOS_DANGER_LUT,
  543. mdata->sde_inline_qos_map);
  544. } else {
  545. SDEROT_DBG("inline danger lut setting not found\n");
  546. }
  547. }
  548. len = sde_mdp_parse_dt_prop_len(pdev, "qcom,mdss-inline-rot-safe-lut");
  549. if (len == SDE_ROT_OP_MAX) {
  550. rc = sde_mdp_parse_dt_handler(pdev,
  551. "qcom,mdss-inline-rot-safe-lut", data, len);
  552. if (!rc) {
  553. mdata->inline_lut_cfg[SDE_ROT_RD].safe_lut
  554. = data[SDE_ROT_RD];
  555. mdata->inline_lut_cfg[SDE_ROT_WR].safe_lut
  556. = data[SDE_ROT_WR];
  557. set_bit(SDE_INLINE_QOS_SAFE_LUT,
  558. mdata->sde_inline_qos_map);
  559. } else {
  560. SDEROT_DBG("inline safe lut setting not found\n");
  561. }
  562. }
  563. }
  564. static int sde_mdp_parse_dt_misc(struct platform_device *pdev,
  565. struct sde_rot_data_type *mdata)
  566. {
  567. int rc;
  568. u32 data;
  569. rc = of_property_read_u32(pdev->dev.of_node, "qcom,mdss-rot-block-size",
  570. &data);
  571. mdata->rot_block_size = (!rc ? data : 128);
  572. rc = of_property_read_u32(pdev->dev.of_node,
  573. "qcom,mdss-default-ot-rd-limit", &data);
  574. mdata->default_ot_rd_limit = (!rc ? data : 0);
  575. rc = of_property_read_u32(pdev->dev.of_node,
  576. "qcom,mdss-default-ot-wr-limit", &data);
  577. mdata->default_ot_wr_limit = (!rc ? data : 0);
  578. rc = of_property_read_u32(pdev->dev.of_node,
  579. "qcom,mdss-highest-bank-bit", &(mdata->highest_bank_bit));
  580. if (rc)
  581. SDEROT_DBG(
  582. "Could not read optional property: highest bank bit\n");
  583. sde_mdp_parse_cdp_setting(pdev, mdata);
  584. sde_mdp_parse_vbif_qos(pdev, mdata);
  585. sde_mdp_parse_vbif_memtype(pdev, mdata);
  586. sde_mdp_parse_rot_lut_setting(pdev, mdata);
  587. sde_mdp_parse_inline_rot_lut_setting(pdev, mdata);
  588. rc = of_property_read_u32(pdev->dev.of_node,
  589. "qcom,mdss-rot-qos-cpu-mask", &data);
  590. mdata->rot_pm_qos_cpu_mask = (!rc ? data : 0);
  591. rc = of_property_read_u32(pdev->dev.of_node,
  592. "qcom,mdss-rot-qos-cpu-dma-latency", &data);
  593. mdata->rot_pm_qos_cpu_dma_latency = (!rc ? data : 0);
  594. mdata->mdp_base = mdata->sde_io.base + SDE_MDP_OFFSET;
  595. return 0;
  596. }
  597. static void sde_mdp_destroy_dt_misc(struct platform_device *pdev,
  598. struct sde_rot_data_type *mdata)
  599. {
  600. kfree(mdata->vbif_memtype);
  601. mdata->vbif_memtype = NULL;
  602. kfree(mdata->vbif_rt_qos);
  603. mdata->vbif_rt_qos = NULL;
  604. kfree(mdata->vbif_nrt_qos);
  605. mdata->vbif_nrt_qos = NULL;
  606. }
  607. #define MDP_REG_BUS_VECTOR_ENTRY(ab_val, ib_val) \
  608. { \
  609. .src = MSM_BUS_MASTER_AMPSS_M0, \
  610. .dst = MSM_BUS_SLAVE_DISPLAY_CFG, \
  611. .ab = (ab_val), \
  612. .ib = (ib_val), \
  613. }
  614. #define BUS_VOTE_19_MHZ 153600000
  615. #define BUS_VOTE_40_MHZ 320000000
  616. #define BUS_VOTE_80_MHZ 640000000
  617. #ifdef CONFIG_QCOM_BUS_SCALING
  618. static struct msm_bus_vectors mdp_reg_bus_vectors[] = {
  619. MDP_REG_BUS_VECTOR_ENTRY(0, 0),
  620. MDP_REG_BUS_VECTOR_ENTRY(0, BUS_VOTE_19_MHZ),
  621. MDP_REG_BUS_VECTOR_ENTRY(0, BUS_VOTE_40_MHZ),
  622. MDP_REG_BUS_VECTOR_ENTRY(0, BUS_VOTE_80_MHZ),
  623. };
  624. static struct msm_bus_paths mdp_reg_bus_usecases[ARRAY_SIZE(
  625. mdp_reg_bus_vectors)];
  626. static struct msm_bus_scale_pdata mdp_reg_bus_scale_table = {
  627. .usecase = mdp_reg_bus_usecases,
  628. .num_usecases = ARRAY_SIZE(mdp_reg_bus_usecases),
  629. .name = "sde_reg",
  630. .active_only = true,
  631. };
  632. static int sde_mdp_bus_scale_register(struct sde_rot_data_type *mdata)
  633. {
  634. struct msm_bus_scale_pdata *reg_bus_pdata;
  635. int i;
  636. if (!mdata->reg_bus_hdl) {
  637. reg_bus_pdata = &mdp_reg_bus_scale_table;
  638. for (i = 0; i < reg_bus_pdata->num_usecases; i++) {
  639. mdp_reg_bus_usecases[i].num_paths = 1;
  640. mdp_reg_bus_usecases[i].vectors =
  641. &mdp_reg_bus_vectors[i];
  642. }
  643. mdata->reg_bus_hdl =
  644. msm_bus_scale_register_client(reg_bus_pdata);
  645. if (!mdata->reg_bus_hdl) {
  646. /* Continue without reg_bus scaling */
  647. SDEROT_WARN("reg_bus_client register failed\n");
  648. } else
  649. SDEROT_DBG("register reg_bus_hdl=%x\n",
  650. mdata->reg_bus_hdl);
  651. }
  652. return 0;
  653. }
  654. #else
  655. static inline int sde_mdp_bus_scale_register(struct sde_rot_data_type *mdata)
  656. {
  657. return 0;
  658. }
  659. #endif
  660. static void sde_mdp_bus_scale_unregister(struct sde_rot_data_type *mdata)
  661. {
  662. SDEROT_DBG("unregister reg_bus_hdl=%x\n", mdata->reg_bus_hdl);
  663. if (mdata->reg_bus_hdl) {
  664. msm_bus_scale_unregister_client(mdata->reg_bus_hdl);
  665. mdata->reg_bus_hdl = 0;
  666. }
  667. }
  668. static struct sde_rot_data_type *sde_rot_res;
  669. struct sde_rot_data_type *sde_rot_get_mdata(void)
  670. {
  671. return sde_rot_res;
  672. }
  673. /*
  674. * sde_rotator_base_init - initialize base rotator data/resource
  675. */
  676. int sde_rotator_base_init(struct sde_rot_data_type **pmdata,
  677. struct platform_device *pdev,
  678. const void *drvdata)
  679. {
  680. int rc;
  681. struct sde_rot_data_type *mdata;
  682. mdata = devm_kzalloc(&pdev->dev, sizeof(*mdata), GFP_KERNEL);
  683. if (mdata == NULL)
  684. return -ENOMEM;
  685. mdata->pdev = pdev;
  686. sde_rot_res = mdata;
  687. mutex_init(&mdata->reg_bus_lock);
  688. INIT_LIST_HEAD(&mdata->reg_bus_clist);
  689. rc = sde_rot_ioremap_byname(pdev, &mdata->sde_io, "mdp_phys");
  690. if (rc) {
  691. SDEROT_ERR("unable to map SDE base\n");
  692. goto probe_done;
  693. }
  694. SDEROT_DBG("SDE ROT HW Base addr=0x%x len=0x%x\n",
  695. (int) (unsigned long) mdata->sde_io.base,
  696. mdata->sde_io.len);
  697. rc = sde_rot_ioremap_byname(pdev, &mdata->vbif_nrt_io, "rot_vbif_phys");
  698. if (rc) {
  699. SDEROT_ERR("unable to map SDE ROT VBIF base\n");
  700. goto probe_done;
  701. }
  702. SDEROT_DBG("SDE ROT VBIF HW Base addr=%pK len=0x%x\n",
  703. mdata->vbif_nrt_io.base, mdata->vbif_nrt_io.len);
  704. rc = sde_mdp_parse_dt_misc(pdev, mdata);
  705. if (rc) {
  706. SDEROT_ERR("Error in device tree : misc\n");
  707. goto probe_done;
  708. }
  709. rc = sde_mdp_bus_scale_register(mdata);
  710. if (rc) {
  711. SDEROT_ERR("unable to register bus scaling\n");
  712. goto probe_done;
  713. }
  714. rc = sde_smmu_init(&pdev->dev);
  715. if (rc) {
  716. SDEROT_ERR("sde smmu init failed %d\n", rc);
  717. goto probe_done;
  718. }
  719. *pmdata = mdata;
  720. return 0;
  721. probe_done:
  722. return rc;
  723. }
  724. /*
  725. * sde_rotator_base_destroy - clean up base rotator data/resource
  726. */
  727. void sde_rotator_base_destroy(struct sde_rot_data_type *mdata)
  728. {
  729. struct platform_device *pdev;
  730. if (!mdata || !mdata->pdev)
  731. return;
  732. pdev = mdata->pdev;
  733. sde_rot_res = NULL;
  734. sde_mdp_bus_scale_unregister(mdata);
  735. sde_mdp_destroy_dt_misc(pdev, mdata);
  736. sde_rot_iounmap(&mdata->vbif_nrt_io);
  737. sde_rot_iounmap(&mdata->sde_io);
  738. devm_kfree(&pdev->dev, mdata);
  739. }