stm32l4x5_rcc.c 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477
  1. /*
  2. * STM32L4X5 RCC (Reset and clock control)
  3. *
  4. * Copyright (c) 2023 Arnaud Minier <arnaud.minier@telecom-paris.fr>
  5. * Copyright (c) 2023 Inès Varhol <ines.varhol@telecom-paris.fr>
  6. *
  7. * SPDX-License-Identifier: GPL-2.0-or-later
  8. *
  9. * This work is licensed under the terms of the GNU GPL, version 2 or later.
  10. * See the COPYING file in the top-level directory.
  11. *
  12. * The reference used is the STMicroElectronics RM0351 Reference manual
  13. * for STM32L4x5 and STM32L4x6 advanced Arm ® -based 32-bit MCUs.
  14. *
  15. * Inspired by the BCM2835 CPRMAN clock manager implementation by Luc Michel.
  16. */
  17. #include "qemu/osdep.h"
  18. #include "qemu/log.h"
  19. #include "qemu/module.h"
  20. #include "qemu/timer.h"
  21. #include "qapi/error.h"
  22. #include "migration/vmstate.h"
  23. #include "hw/misc/stm32l4x5_rcc.h"
  24. #include "hw/misc/stm32l4x5_rcc_internals.h"
  25. #include "hw/clock.h"
  26. #include "hw/irq.h"
  27. #include "hw/qdev-clock.h"
  28. #include "hw/qdev-properties.h"
  29. #include "hw/qdev-properties-system.h"
  30. #include "hw/registerfields.h"
  31. #include "trace.h"
  32. #define HSE_DEFAULT_FRQ 48000000ULL
  33. #define HSI_FRQ 16000000ULL
  34. #define MSI_DEFAULT_FRQ 4000000ULL
  35. #define LSE_FRQ 32768ULL
  36. #define LSI_FRQ 32000ULL
  37. /*
  38. * Function to simply acknowledge and propagate changes in a clock mux
  39. * frequency.
  40. * `bypass_source` allows to bypass the period of the current source and just
  41. * consider it equal to 0. This is useful during the hold phase of reset.
  42. */
  43. static void clock_mux_update(RccClockMuxState *mux, bool bypass_source)
  44. {
  45. uint64_t src_freq;
  46. Clock *current_source = mux->srcs[mux->src];
  47. uint32_t freq_multiplier = 0;
  48. bool clk_changed = false;
  49. /*
  50. * To avoid rounding errors, we use the clock period instead of the
  51. * frequency.
  52. * This means that the multiplier of the mux becomes the divider of
  53. * the clock and the divider of the mux becomes the multiplier of the
  54. * clock.
  55. */
  56. if (!bypass_source && mux->enabled && mux->divider) {
  57. freq_multiplier = mux->divider;
  58. }
  59. clk_changed |= clock_set_mul_div(mux->out, freq_multiplier, mux->multiplier);
  60. clk_changed |= clock_set(mux->out, clock_get(current_source));
  61. if (clk_changed) {
  62. clock_propagate(mux->out);
  63. }
  64. src_freq = clock_get_hz(current_source);
  65. /* TODO: can we simply detect if the config changed so that we reduce log spam ? */
  66. trace_stm32l4x5_rcc_mux_update(mux->id, mux->src, src_freq,
  67. mux->multiplier, mux->divider);
  68. }
  69. static void clock_mux_src_update(void *opaque, ClockEvent event)
  70. {
  71. RccClockMuxState **backref = opaque;
  72. RccClockMuxState *s = *backref;
  73. /*
  74. * The backref value is equal to:
  75. * s->backref + (sizeof(RccClockMuxState *) * update_src).
  76. * By subtracting we can get back the index of the updated clock.
  77. */
  78. const uint32_t update_src = backref - s->backref;
  79. /* Only update if the clock that was updated is the current source */
  80. if (update_src == s->src) {
  81. clock_mux_update(s, false);
  82. }
  83. }
  84. static void clock_mux_init(Object *obj)
  85. {
  86. RccClockMuxState *s = RCC_CLOCK_MUX(obj);
  87. size_t i;
  88. for (i = 0; i < RCC_NUM_CLOCK_MUX_SRC; i++) {
  89. char *name = g_strdup_printf("srcs[%zu]", i);
  90. s->backref[i] = s;
  91. s->srcs[i] = qdev_init_clock_in(DEVICE(s), name,
  92. clock_mux_src_update,
  93. &s->backref[i],
  94. ClockUpdate);
  95. g_free(name);
  96. }
  97. s->out = qdev_init_clock_out(DEVICE(s), "out");
  98. }
  99. static void clock_mux_reset_enter(Object *obj, ResetType type)
  100. {
  101. RccClockMuxState *s = RCC_CLOCK_MUX(obj);
  102. set_clock_mux_init_info(s, s->id);
  103. }
  104. static void clock_mux_reset_hold(Object *obj, ResetType type)
  105. {
  106. RccClockMuxState *s = RCC_CLOCK_MUX(obj);
  107. clock_mux_update(s, true);
  108. }
  109. static void clock_mux_reset_exit(Object *obj, ResetType type)
  110. {
  111. RccClockMuxState *s = RCC_CLOCK_MUX(obj);
  112. clock_mux_update(s, false);
  113. }
  114. static const VMStateDescription clock_mux_vmstate = {
  115. .name = TYPE_RCC_CLOCK_MUX,
  116. .version_id = 1,
  117. .minimum_version_id = 1,
  118. .fields = (VMStateField[]) {
  119. VMSTATE_UINT32(id, RccClockMuxState),
  120. VMSTATE_ARRAY_CLOCK(srcs, RccClockMuxState,
  121. RCC_NUM_CLOCK_MUX_SRC),
  122. VMSTATE_BOOL(enabled, RccClockMuxState),
  123. VMSTATE_UINT32(src, RccClockMuxState),
  124. VMSTATE_UINT32(multiplier, RccClockMuxState),
  125. VMSTATE_UINT32(divider, RccClockMuxState),
  126. VMSTATE_END_OF_LIST()
  127. }
  128. };
  129. static void clock_mux_class_init(ObjectClass *klass, void *data)
  130. {
  131. DeviceClass *dc = DEVICE_CLASS(klass);
  132. ResettableClass *rc = RESETTABLE_CLASS(klass);
  133. rc->phases.enter = clock_mux_reset_enter;
  134. rc->phases.hold = clock_mux_reset_hold;
  135. rc->phases.exit = clock_mux_reset_exit;
  136. dc->vmsd = &clock_mux_vmstate;
  137. /* Reason: Part of Stm32l4x5RccState component */
  138. dc->user_creatable = false;
  139. }
  140. static void clock_mux_set_enable(RccClockMuxState *mux, bool enabled)
  141. {
  142. if (mux->enabled == enabled) {
  143. return;
  144. }
  145. if (enabled) {
  146. trace_stm32l4x5_rcc_mux_enable(mux->id);
  147. } else {
  148. trace_stm32l4x5_rcc_mux_disable(mux->id);
  149. }
  150. mux->enabled = enabled;
  151. clock_mux_update(mux, false);
  152. }
  153. static void clock_mux_set_factor(RccClockMuxState *mux,
  154. uint32_t multiplier, uint32_t divider)
  155. {
  156. if (mux->multiplier == multiplier && mux->divider == divider) {
  157. return;
  158. }
  159. trace_stm32l4x5_rcc_mux_set_factor(mux->id,
  160. mux->multiplier, multiplier, mux->divider, divider);
  161. mux->multiplier = multiplier;
  162. mux->divider = divider;
  163. clock_mux_update(mux, false);
  164. }
  165. static void clock_mux_set_source(RccClockMuxState *mux, RccClockMuxSource src)
  166. {
  167. if (mux->src == src) {
  168. return;
  169. }
  170. trace_stm32l4x5_rcc_mux_set_src(mux->id, mux->src, src);
  171. mux->src = src;
  172. clock_mux_update(mux, false);
  173. }
  174. /*
  175. * Acknowledge and propagate changes in a PLL frequency.
  176. * `bypass_source` allows to bypass the period of the current source and just
  177. * consider it equal to 0. This is useful during the hold phase of reset.
  178. */
  179. static void pll_update(RccPllState *pll, bool bypass_source)
  180. {
  181. uint64_t vco_freq, old_channel_freq, channel_freq;
  182. int i;
  183. /* The common PLLM factor is handled by the PLL mux */
  184. vco_freq = muldiv64(clock_get_hz(pll->in), pll->vco_multiplier, 1);
  185. for (i = 0; i < RCC_NUM_CHANNEL_PLL_OUT; i++) {
  186. if (!pll->channel_exists[i]) {
  187. continue;
  188. }
  189. old_channel_freq = clock_get_hz(pll->channels[i]);
  190. if (bypass_source ||
  191. !pll->enabled ||
  192. !pll->channel_enabled[i] ||
  193. !pll->channel_divider[i]) {
  194. channel_freq = 0;
  195. } else {
  196. channel_freq = muldiv64(vco_freq,
  197. 1,
  198. pll->channel_divider[i]);
  199. }
  200. /* No change, early continue to avoid log spam and useless propagation */
  201. if (old_channel_freq == channel_freq) {
  202. continue;
  203. }
  204. clock_update_hz(pll->channels[i], channel_freq);
  205. trace_stm32l4x5_rcc_pll_update(pll->id, i, vco_freq,
  206. old_channel_freq, channel_freq);
  207. }
  208. }
  209. static void pll_src_update(void *opaque, ClockEvent event)
  210. {
  211. RccPllState *s = opaque;
  212. pll_update(s, false);
  213. }
  214. static void pll_init(Object *obj)
  215. {
  216. RccPllState *s = RCC_PLL(obj);
  217. size_t i;
  218. s->in = qdev_init_clock_in(DEVICE(s), "in",
  219. pll_src_update, s, ClockUpdate);
  220. const char *names[] = {
  221. "out-p", "out-q", "out-r",
  222. };
  223. for (i = 0; i < RCC_NUM_CHANNEL_PLL_OUT; i++) {
  224. s->channels[i] = qdev_init_clock_out(DEVICE(s), names[i]);
  225. }
  226. }
  227. static void pll_reset_enter(Object *obj, ResetType type)
  228. {
  229. RccPllState *s = RCC_PLL(obj);
  230. set_pll_init_info(s, s->id);
  231. }
  232. static void pll_reset_hold(Object *obj, ResetType type)
  233. {
  234. RccPllState *s = RCC_PLL(obj);
  235. pll_update(s, true);
  236. }
  237. static void pll_reset_exit(Object *obj, ResetType type)
  238. {
  239. RccPllState *s = RCC_PLL(obj);
  240. pll_update(s, false);
  241. }
  242. static const VMStateDescription pll_vmstate = {
  243. .name = TYPE_RCC_PLL,
  244. .version_id = 1,
  245. .minimum_version_id = 1,
  246. .fields = (VMStateField[]) {
  247. VMSTATE_UINT32(id, RccPllState),
  248. VMSTATE_CLOCK(in, RccPllState),
  249. VMSTATE_ARRAY_CLOCK(channels, RccPllState,
  250. RCC_NUM_CHANNEL_PLL_OUT),
  251. VMSTATE_BOOL(enabled, RccPllState),
  252. VMSTATE_UINT32(vco_multiplier, RccPllState),
  253. VMSTATE_BOOL_ARRAY(channel_enabled, RccPllState, RCC_NUM_CHANNEL_PLL_OUT),
  254. VMSTATE_BOOL_ARRAY(channel_exists, RccPllState, RCC_NUM_CHANNEL_PLL_OUT),
  255. VMSTATE_UINT32_ARRAY(channel_divider, RccPllState, RCC_NUM_CHANNEL_PLL_OUT),
  256. VMSTATE_END_OF_LIST()
  257. }
  258. };
  259. static void pll_class_init(ObjectClass *klass, void *data)
  260. {
  261. DeviceClass *dc = DEVICE_CLASS(klass);
  262. ResettableClass *rc = RESETTABLE_CLASS(klass);
  263. rc->phases.enter = pll_reset_enter;
  264. rc->phases.hold = pll_reset_hold;
  265. rc->phases.exit = pll_reset_exit;
  266. dc->vmsd = &pll_vmstate;
  267. /* Reason: Part of Stm32l4x5RccState component */
  268. dc->user_creatable = false;
  269. }
  270. static void pll_set_vco_multiplier(RccPllState *pll, uint32_t vco_multiplier)
  271. {
  272. if (pll->vco_multiplier == vco_multiplier) {
  273. return;
  274. }
  275. if (vco_multiplier < 8 || vco_multiplier > 86) {
  276. qemu_log_mask(LOG_GUEST_ERROR,
  277. "%s: VCO multiplier is out of bound (%u) for PLL %u\n",
  278. __func__, vco_multiplier, pll->id);
  279. return;
  280. }
  281. trace_stm32l4x5_rcc_pll_set_vco_multiplier(pll->id,
  282. pll->vco_multiplier, vco_multiplier);
  283. pll->vco_multiplier = vco_multiplier;
  284. pll_update(pll, false);
  285. }
  286. static void pll_set_enable(RccPllState *pll, bool enabled)
  287. {
  288. if (pll->enabled == enabled) {
  289. return;
  290. }
  291. pll->enabled = enabled;
  292. pll_update(pll, false);
  293. }
  294. static void pll_set_channel_enable(RccPllState *pll,
  295. PllCommonChannels channel,
  296. bool enabled)
  297. {
  298. if (pll->channel_enabled[channel] == enabled) {
  299. return;
  300. }
  301. if (enabled) {
  302. trace_stm32l4x5_rcc_pll_channel_enable(pll->id, channel);
  303. } else {
  304. trace_stm32l4x5_rcc_pll_channel_disable(pll->id, channel);
  305. }
  306. pll->channel_enabled[channel] = enabled;
  307. pll_update(pll, false);
  308. }
  309. static void pll_set_channel_divider(RccPllState *pll,
  310. PllCommonChannels channel,
  311. uint32_t divider)
  312. {
  313. if (pll->channel_divider[channel] == divider) {
  314. return;
  315. }
  316. trace_stm32l4x5_rcc_pll_set_channel_divider(pll->id,
  317. channel, pll->channel_divider[channel], divider);
  318. pll->channel_divider[channel] = divider;
  319. pll_update(pll, false);
  320. }
  321. static void rcc_update_irq(Stm32l4x5RccState *s)
  322. {
  323. /*
  324. * TODO: Handle LSECSSF and CSSF flags when the CSS is implemented.
  325. */
  326. if (s->cifr & CIFR_IRQ_MASK) {
  327. qemu_irq_raise(s->irq);
  328. } else {
  329. qemu_irq_lower(s->irq);
  330. }
  331. }
  332. static void rcc_update_msi(Stm32l4x5RccState *s, uint32_t previous_value)
  333. {
  334. uint32_t val;
  335. static const uint32_t msirange[] = {
  336. 100000, 200000, 400000, 800000, 1000000, 2000000,
  337. 4000000, 8000000, 16000000, 24000000, 32000000, 48000000
  338. };
  339. /* MSIRANGE and MSIRGSEL */
  340. val = extract32(s->cr, R_CR_MSIRGSEL_SHIFT, R_CR_MSIRGSEL_LENGTH);
  341. if (val) {
  342. /* MSIRGSEL is set, use the MSIRANGE field */
  343. val = extract32(s->cr, R_CR_MSIRANGE_SHIFT, R_CR_MSIRANGE_LENGTH);
  344. } else {
  345. /* MSIRGSEL is not set, use the MSISRANGE field */
  346. val = extract32(s->csr, R_CSR_MSISRANGE_SHIFT, R_CSR_MSISRANGE_LENGTH);
  347. }
  348. if (val < ARRAY_SIZE(msirange)) {
  349. clock_update_hz(s->msi_rc, msirange[val]);
  350. } else {
  351. /*
  352. * There is a hardware write protection if the value is out of bound.
  353. * Restore the previous value.
  354. */
  355. s->cr = (s->cr & ~R_CSR_MSISRANGE_MASK) |
  356. (previous_value & R_CSR_MSISRANGE_MASK);
  357. }
  358. }
  359. /*
  360. * TODO: Add write-protection for all registers:
  361. * DONE: CR
  362. */
  363. static void rcc_update_cr_register(Stm32l4x5RccState *s, uint32_t previous_value)
  364. {
  365. int val;
  366. const RccClockMuxSource current_pll_src =
  367. CLOCK_MUX_INIT_INFO[RCC_CLOCK_MUX_PLL_INPUT].src_mapping[
  368. s->clock_muxes[RCC_CLOCK_MUX_PLL_INPUT].src];
  369. /* PLLSAI2ON and update PLLSAI2RDY */
  370. val = FIELD_EX32(s->cr, CR, PLLSAI2ON);
  371. pll_set_enable(&s->plls[RCC_PLL_PLLSAI2], val);
  372. s->cr = (s->cr & ~R_CR_PLLSAI2RDY_MASK) |
  373. (val << R_CR_PLLSAI2RDY_SHIFT);
  374. if (s->cier & R_CIER_PLLSAI2RDYIE_MASK) {
  375. s->cifr |= R_CIFR_PLLSAI2RDYF_MASK;
  376. }
  377. /* PLLSAI1ON and update PLLSAI1RDY */
  378. val = FIELD_EX32(s->cr, CR, PLLSAI1ON);
  379. pll_set_enable(&s->plls[RCC_PLL_PLLSAI1], val);
  380. s->cr = (s->cr & ~R_CR_PLLSAI1RDY_MASK) |
  381. (val << R_CR_PLLSAI1RDY_SHIFT);
  382. if (s->cier & R_CIER_PLLSAI1RDYIE_MASK) {
  383. s->cifr |= R_CIFR_PLLSAI1RDYF_MASK;
  384. }
  385. /*
  386. * PLLON and update PLLRDY
  387. * PLLON cannot be reset if the PLL clock is used as the system clock.
  388. */
  389. val = FIELD_EX32(s->cr, CR, PLLON);
  390. if (FIELD_EX32(s->cfgr, CFGR, SWS) != 0b11) {
  391. pll_set_enable(&s->plls[RCC_PLL_PLL], val);
  392. s->cr = (s->cr & ~R_CR_PLLRDY_MASK) |
  393. (val << R_CR_PLLRDY_SHIFT);
  394. if (s->cier & R_CIER_PLLRDYIE_MASK) {
  395. s->cifr |= R_CIFR_PLLRDYF_MASK;
  396. }
  397. } else {
  398. s->cr |= R_CR_PLLON_MASK;
  399. }
  400. /* CSSON: TODO */
  401. /* HSEBYP: TODO */
  402. /*
  403. * HSEON and update HSERDY.
  404. * HSEON cannot be reset if the HSE oscillator is used directly or
  405. * indirectly as the system clock.
  406. */
  407. val = FIELD_EX32(s->cr, CR, HSEON);
  408. if (FIELD_EX32(s->cfgr, CFGR, SWS) != 0b10 &&
  409. current_pll_src != RCC_CLOCK_MUX_SRC_HSE) {
  410. s->cr = (s->cr & ~R_CR_HSERDY_MASK) |
  411. (val << R_CR_HSERDY_SHIFT);
  412. if (val) {
  413. clock_update_hz(s->hse, s->hse_frequency);
  414. if (s->cier & R_CIER_HSERDYIE_MASK) {
  415. s->cifr |= R_CIFR_HSERDYF_MASK;
  416. }
  417. } else {
  418. clock_update(s->hse, 0);
  419. }
  420. } else {
  421. s->cr |= R_CR_HSEON_MASK;
  422. }
  423. /* HSIAFS: TODO*/
  424. /* HSIKERON: TODO*/
  425. /*
  426. * HSION and update HSIRDY
  427. * HSION is set by hardware if the HSI16 is used directly
  428. * or indirectly as system clock.
  429. */
  430. if (FIELD_EX32(s->cfgr, CFGR, SWS) == 0b01 ||
  431. current_pll_src == RCC_CLOCK_MUX_SRC_HSI) {
  432. s->cr |= (R_CR_HSION_MASK | R_CR_HSIRDY_MASK);
  433. clock_update_hz(s->hsi16_rc, HSI_FRQ);
  434. if (s->cier & R_CIER_HSIRDYIE_MASK) {
  435. s->cifr |= R_CIFR_HSIRDYF_MASK;
  436. }
  437. } else {
  438. val = FIELD_EX32(s->cr, CR, HSION);
  439. if (val) {
  440. clock_update_hz(s->hsi16_rc, HSI_FRQ);
  441. s->cr |= R_CR_HSIRDY_MASK;
  442. if (s->cier & R_CIER_HSIRDYIE_MASK) {
  443. s->cifr |= R_CIFR_HSIRDYF_MASK;
  444. }
  445. } else {
  446. clock_update(s->hsi16_rc, 0);
  447. s->cr &= ~R_CR_HSIRDY_MASK;
  448. }
  449. }
  450. /* MSIPLLEN: TODO */
  451. /*
  452. * MSION and update MSIRDY
  453. * Set by hardware when used directly or indirectly as system clock.
  454. */
  455. if (FIELD_EX32(s->cfgr, CFGR, SWS) == 0b00 ||
  456. current_pll_src == RCC_CLOCK_MUX_SRC_MSI) {
  457. s->cr |= (R_CR_MSION_MASK | R_CR_MSIRDY_MASK);
  458. if (!(previous_value & R_CR_MSION_MASK) && (s->cier & R_CIER_MSIRDYIE_MASK)) {
  459. s->cifr |= R_CIFR_MSIRDYF_MASK;
  460. }
  461. rcc_update_msi(s, previous_value);
  462. } else {
  463. val = FIELD_EX32(s->cr, CR, MSION);
  464. if (val) {
  465. s->cr |= R_CR_MSIRDY_MASK;
  466. rcc_update_msi(s, previous_value);
  467. if (s->cier & R_CIER_MSIRDYIE_MASK) {
  468. s->cifr |= R_CIFR_MSIRDYF_MASK;
  469. }
  470. } else {
  471. s->cr &= ~R_CR_MSIRDY_MASK;
  472. clock_update(s->msi_rc, 0);
  473. }
  474. }
  475. rcc_update_irq(s);
  476. }
  477. static void rcc_update_cfgr_register(Stm32l4x5RccState *s)
  478. {
  479. uint32_t val;
  480. /* MCOPRE */
  481. val = FIELD_EX32(s->cfgr, CFGR, MCOPRE);
  482. if (val > 0b100) {
  483. qemu_log_mask(LOG_GUEST_ERROR,
  484. "%s: Invalid MCOPRE value: 0x%"PRIx32"\n",
  485. __func__, val);
  486. clock_mux_set_enable(&s->clock_muxes[RCC_CLOCK_MUX_MCO], false);
  487. } else {
  488. clock_mux_set_factor(&s->clock_muxes[RCC_CLOCK_MUX_MCO],
  489. 1, 1 << val);
  490. }
  491. /* MCOSEL */
  492. val = FIELD_EX32(s->cfgr, CFGR, MCOSEL);
  493. if (val > 0b111) {
  494. qemu_log_mask(LOG_GUEST_ERROR,
  495. "%s: Invalid MCOSEL value: 0x%"PRIx32"\n",
  496. __func__, val);
  497. clock_mux_set_enable(&s->clock_muxes[RCC_CLOCK_MUX_MCO], false);
  498. } else {
  499. if (val == 0) {
  500. clock_mux_set_enable(&s->clock_muxes[RCC_CLOCK_MUX_MCO], false);
  501. } else {
  502. clock_mux_set_enable(&s->clock_muxes[RCC_CLOCK_MUX_MCO], true);
  503. clock_mux_set_source(&s->clock_muxes[RCC_CLOCK_MUX_MCO],
  504. val - 1);
  505. }
  506. }
  507. /* STOPWUCK */
  508. /* TODO */
  509. /* PPRE2 */
  510. val = FIELD_EX32(s->cfgr, CFGR, PPRE2);
  511. if (val < 0b100) {
  512. clock_mux_set_factor(&s->clock_muxes[RCC_CLOCK_MUX_PCLK2],
  513. 1, 1);
  514. } else {
  515. clock_mux_set_factor(&s->clock_muxes[RCC_CLOCK_MUX_PCLK2],
  516. 1, 1 << (val - 0b11));
  517. }
  518. /* PPRE1 */
  519. val = FIELD_EX32(s->cfgr, CFGR, PPRE1);
  520. if (val < 0b100) {
  521. clock_mux_set_factor(&s->clock_muxes[RCC_CLOCK_MUX_PCLK1],
  522. 1, 1);
  523. } else {
  524. clock_mux_set_factor(&s->clock_muxes[RCC_CLOCK_MUX_PCLK1],
  525. 1, 1 << (val - 0b11));
  526. }
  527. /* HPRE */
  528. val = FIELD_EX32(s->cfgr, CFGR, HPRE);
  529. if (val < 0b1000) {
  530. clock_mux_set_factor(&s->clock_muxes[RCC_CLOCK_MUX_HCLK],
  531. 1, 1);
  532. } else {
  533. clock_mux_set_factor(&s->clock_muxes[RCC_CLOCK_MUX_HCLK],
  534. 1, 1 << (val - 0b111));
  535. }
  536. /* Update SWS */
  537. val = FIELD_EX32(s->cfgr, CFGR, SW);
  538. clock_mux_set_source(&s->clock_muxes[RCC_CLOCK_MUX_SYSCLK],
  539. val);
  540. s->cfgr &= ~R_CFGR_SWS_MASK;
  541. s->cfgr |= val << R_CFGR_SWS_SHIFT;
  542. }
  543. static void rcc_update_ahb1enr(Stm32l4x5RccState *s)
  544. {
  545. #define AHB1ENR_SET_ENABLE(_peripheral_name) \
  546. clock_mux_set_enable(&s->clock_muxes[RCC_CLOCK_MUX_##_peripheral_name], \
  547. FIELD_EX32(s->ahb1enr, AHB1ENR, _peripheral_name##EN))
  548. /* DMA2DEN: reserved for STM32L475xx */
  549. AHB1ENR_SET_ENABLE(TSC);
  550. AHB1ENR_SET_ENABLE(CRC);
  551. AHB1ENR_SET_ENABLE(FLASH);
  552. AHB1ENR_SET_ENABLE(DMA2);
  553. AHB1ENR_SET_ENABLE(DMA1);
  554. #undef AHB1ENR_SET_ENABLE
  555. }
  556. static void rcc_update_ahb2enr(Stm32l4x5RccState *s)
  557. {
  558. #define AHB2ENR_SET_ENABLE(_peripheral_name) \
  559. clock_mux_set_enable(&s->clock_muxes[RCC_CLOCK_MUX_##_peripheral_name], \
  560. FIELD_EX32(s->ahb2enr, AHB2ENR, _peripheral_name##EN))
  561. AHB2ENR_SET_ENABLE(RNG);
  562. /* HASHEN: reserved for STM32L475xx */
  563. AHB2ENR_SET_ENABLE(AES);
  564. /* DCMIEN: reserved for STM32L475xx */
  565. AHB2ENR_SET_ENABLE(ADC);
  566. AHB2ENR_SET_ENABLE(OTGFS);
  567. /* GPIOIEN: reserved for STM32L475xx */
  568. AHB2ENR_SET_ENABLE(GPIOA);
  569. AHB2ENR_SET_ENABLE(GPIOB);
  570. AHB2ENR_SET_ENABLE(GPIOC);
  571. AHB2ENR_SET_ENABLE(GPIOD);
  572. AHB2ENR_SET_ENABLE(GPIOE);
  573. AHB2ENR_SET_ENABLE(GPIOF);
  574. AHB2ENR_SET_ENABLE(GPIOG);
  575. AHB2ENR_SET_ENABLE(GPIOH);
  576. #undef AHB2ENR_SET_ENABLE
  577. }
  578. static void rcc_update_ahb3enr(Stm32l4x5RccState *s)
  579. {
  580. #define AHB3ENR_SET_ENABLE(_peripheral_name) \
  581. clock_mux_set_enable(&s->clock_muxes[RCC_CLOCK_MUX_##_peripheral_name], \
  582. FIELD_EX32(s->ahb3enr, AHB3ENR, _peripheral_name##EN))
  583. AHB3ENR_SET_ENABLE(QSPI);
  584. AHB3ENR_SET_ENABLE(FMC);
  585. #undef AHB3ENR_SET_ENABLE
  586. }
  587. static void rcc_update_apb1enr(Stm32l4x5RccState *s)
  588. {
  589. #define APB1ENR1_SET_ENABLE(_peripheral_name) \
  590. clock_mux_set_enable(&s->clock_muxes[RCC_CLOCK_MUX_##_peripheral_name], \
  591. FIELD_EX32(s->apb1enr1, APB1ENR1, _peripheral_name##EN))
  592. #define APB1ENR2_SET_ENABLE(_peripheral_name) \
  593. clock_mux_set_enable(&s->clock_muxes[RCC_CLOCK_MUX_##_peripheral_name], \
  594. FIELD_EX32(s->apb1enr2, APB1ENR2, _peripheral_name##EN))
  595. /* APB1ENR1 */
  596. APB1ENR1_SET_ENABLE(LPTIM1);
  597. APB1ENR1_SET_ENABLE(OPAMP);
  598. APB1ENR1_SET_ENABLE(DAC1);
  599. APB1ENR1_SET_ENABLE(PWR);
  600. /* CAN2: reserved for STM32L4x5 */
  601. APB1ENR1_SET_ENABLE(CAN1);
  602. /* CRSEN: reserved for STM32L4x5 */
  603. APB1ENR1_SET_ENABLE(I2C3);
  604. APB1ENR1_SET_ENABLE(I2C2);
  605. APB1ENR1_SET_ENABLE(I2C1);
  606. APB1ENR1_SET_ENABLE(UART5);
  607. APB1ENR1_SET_ENABLE(UART4);
  608. APB1ENR1_SET_ENABLE(USART3);
  609. APB1ENR1_SET_ENABLE(USART2);
  610. APB1ENR1_SET_ENABLE(SPI3);
  611. APB1ENR1_SET_ENABLE(SPI2);
  612. APB1ENR1_SET_ENABLE(WWDG);
  613. /* RTCAPB: reserved for STM32L4x5 */
  614. APB1ENR1_SET_ENABLE(LCD);
  615. APB1ENR1_SET_ENABLE(TIM7);
  616. APB1ENR1_SET_ENABLE(TIM6);
  617. APB1ENR1_SET_ENABLE(TIM5);
  618. APB1ENR1_SET_ENABLE(TIM4);
  619. APB1ENR1_SET_ENABLE(TIM3);
  620. APB1ENR1_SET_ENABLE(TIM2);
  621. /* APB1ENR2 */
  622. APB1ENR2_SET_ENABLE(LPTIM2);
  623. APB1ENR2_SET_ENABLE(SWPMI1);
  624. /* I2C4EN: reserved for STM32L4x5 */
  625. APB1ENR2_SET_ENABLE(LPUART1);
  626. #undef APB1ENR1_SET_ENABLE
  627. #undef APB1ENR2_SET_ENABLE
  628. }
  629. static void rcc_update_apb2enr(Stm32l4x5RccState *s)
  630. {
  631. #define APB2ENR_SET_ENABLE(_peripheral_name) \
  632. clock_mux_set_enable(&s->clock_muxes[RCC_CLOCK_MUX_##_peripheral_name], \
  633. FIELD_EX32(s->apb2enr, APB2ENR, _peripheral_name##EN))
  634. APB2ENR_SET_ENABLE(DFSDM1);
  635. APB2ENR_SET_ENABLE(SAI2);
  636. APB2ENR_SET_ENABLE(SAI1);
  637. APB2ENR_SET_ENABLE(TIM17);
  638. APB2ENR_SET_ENABLE(TIM16);
  639. APB2ENR_SET_ENABLE(TIM15);
  640. APB2ENR_SET_ENABLE(USART1);
  641. APB2ENR_SET_ENABLE(TIM8);
  642. APB2ENR_SET_ENABLE(SPI1);
  643. APB2ENR_SET_ENABLE(TIM1);
  644. APB2ENR_SET_ENABLE(SDMMC1);
  645. APB2ENR_SET_ENABLE(FW);
  646. APB2ENR_SET_ENABLE(SYSCFG);
  647. #undef APB2ENR_SET_ENABLE
  648. }
  649. /*
  650. * The 3 PLLs share the same register layout
  651. * so we can use the same function for all of them
  652. * Note: no frequency bounds checking is done here.
  653. */
  654. static void rcc_update_pllsaixcfgr(Stm32l4x5RccState *s, RccPll pll_id)
  655. {
  656. uint32_t reg, val;
  657. switch (pll_id) {
  658. case RCC_PLL_PLL:
  659. reg = s->pllcfgr;
  660. break;
  661. case RCC_PLL_PLLSAI1:
  662. reg = s->pllsai1cfgr;
  663. break;
  664. case RCC_PLL_PLLSAI2:
  665. reg = s->pllsai2cfgr;
  666. break;
  667. default:
  668. qemu_log_mask(LOG_GUEST_ERROR,
  669. "%s: Invalid PLL ID: %u\n", __func__, pll_id);
  670. return;
  671. }
  672. /* PLLPDIV */
  673. val = FIELD_EX32(reg, PLLCFGR, PLLPDIV);
  674. /* 1 is a reserved value */
  675. if (val == 0) {
  676. /* Get PLLP value */
  677. val = FIELD_EX32(reg, PLLCFGR, PLLP);
  678. pll_set_channel_divider(&s->plls[pll_id], RCC_PLL_COMMON_CHANNEL_P,
  679. (val ? 17 : 7));
  680. } else if (val > 1) {
  681. pll_set_channel_divider(&s->plls[pll_id], RCC_PLL_COMMON_CHANNEL_P,
  682. val);
  683. }
  684. /* PLLR */
  685. val = FIELD_EX32(reg, PLLCFGR, PLLR);
  686. pll_set_channel_divider(&s->plls[pll_id], RCC_PLL_COMMON_CHANNEL_R,
  687. 2 * (val + 1));
  688. /* PLLREN */
  689. val = FIELD_EX32(reg, PLLCFGR, PLLREN);
  690. pll_set_channel_enable(&s->plls[pll_id], RCC_PLL_COMMON_CHANNEL_R, val);
  691. /* PLLQ */
  692. val = FIELD_EX32(reg, PLLCFGR, PLLQ);
  693. pll_set_channel_divider(&s->plls[pll_id], RCC_PLL_COMMON_CHANNEL_Q,
  694. 2 * (val + 1));
  695. /* PLLQEN */
  696. val = FIELD_EX32(reg, PLLCFGR, PLLQEN);
  697. pll_set_channel_enable(&s->plls[pll_id], RCC_PLL_COMMON_CHANNEL_Q, val);
  698. /* PLLPEN */
  699. val = FIELD_EX32(reg, PLLCFGR, PLLPEN);
  700. pll_set_channel_enable(&s->plls[pll_id], RCC_PLL_COMMON_CHANNEL_P, val);
  701. /* PLLN */
  702. val = FIELD_EX32(reg, PLLCFGR, PLLN);
  703. pll_set_vco_multiplier(&s->plls[pll_id], val);
  704. }
  705. static void rcc_update_pllcfgr(Stm32l4x5RccState *s)
  706. {
  707. int val;
  708. /* Use common layout */
  709. rcc_update_pllsaixcfgr(s, RCC_PLL_PLL);
  710. /* Fetch specific fields for pllcfgr */
  711. /* PLLM */
  712. val = FIELD_EX32(s->pllcfgr, PLLCFGR, PLLM);
  713. clock_mux_set_factor(&s->clock_muxes[RCC_CLOCK_MUX_PLL_INPUT], 1, (val + 1));
  714. /* PLLSRC */
  715. val = FIELD_EX32(s->pllcfgr, PLLCFGR, PLLSRC);
  716. if (val == 0) {
  717. clock_mux_set_enable(&s->clock_muxes[RCC_CLOCK_MUX_PLL_INPUT], false);
  718. } else {
  719. clock_mux_set_source(&s->clock_muxes[RCC_CLOCK_MUX_PLL_INPUT], val - 1);
  720. clock_mux_set_enable(&s->clock_muxes[RCC_CLOCK_MUX_PLL_INPUT], true);
  721. }
  722. }
  723. static void rcc_update_ccipr(Stm32l4x5RccState *s)
  724. {
  725. #define CCIPR_SET_SOURCE(_peripheral_name) \
  726. clock_mux_set_source(&s->clock_muxes[RCC_CLOCK_MUX_##_peripheral_name], \
  727. FIELD_EX32(s->ccipr, CCIPR, _peripheral_name##SEL))
  728. CCIPR_SET_SOURCE(DFSDM1);
  729. CCIPR_SET_SOURCE(SWPMI1);
  730. CCIPR_SET_SOURCE(ADC);
  731. CCIPR_SET_SOURCE(CLK48);
  732. CCIPR_SET_SOURCE(SAI2);
  733. CCIPR_SET_SOURCE(SAI1);
  734. CCIPR_SET_SOURCE(LPTIM2);
  735. CCIPR_SET_SOURCE(LPTIM1);
  736. CCIPR_SET_SOURCE(I2C3);
  737. CCIPR_SET_SOURCE(I2C2);
  738. CCIPR_SET_SOURCE(I2C1);
  739. CCIPR_SET_SOURCE(LPUART1);
  740. CCIPR_SET_SOURCE(UART5);
  741. CCIPR_SET_SOURCE(UART4);
  742. CCIPR_SET_SOURCE(USART3);
  743. CCIPR_SET_SOURCE(USART2);
  744. CCIPR_SET_SOURCE(USART1);
  745. #undef CCIPR_SET_SOURCE
  746. }
  747. static void rcc_update_bdcr(Stm32l4x5RccState *s)
  748. {
  749. int val;
  750. /* LSCOSEL */
  751. val = FIELD_EX32(s->bdcr, BDCR, LSCOSEL);
  752. clock_mux_set_source(&s->clock_muxes[RCC_CLOCK_MUX_LSCO], val);
  753. val = FIELD_EX32(s->bdcr, BDCR, LSCOEN);
  754. clock_mux_set_enable(&s->clock_muxes[RCC_CLOCK_MUX_LSCO], val);
  755. /* BDRST */
  756. /*
  757. * The documentation is not clear if the RTCEN flag disables the RTC and
  758. * the LCD common mux or if it only affects the RTC.
  759. * As the LCDEN flag exists, we assume here that it only affects the RTC.
  760. */
  761. val = FIELD_EX32(s->bdcr, BDCR, RTCEN);
  762. clock_mux_set_enable(&s->clock_muxes[RCC_CLOCK_MUX_RTC], val);
  763. /* LCD and RTC share the same clock */
  764. val = FIELD_EX32(s->bdcr, BDCR, RTCSEL);
  765. clock_mux_set_source(&s->clock_muxes[RCC_CLOCK_MUX_LCD_AND_RTC_COMMON], val);
  766. /* LSECSSON */
  767. /* LSEDRV[1:0] */
  768. /* LSEBYP */
  769. /* LSEON: Update LSERDY at the same time */
  770. val = FIELD_EX32(s->bdcr, BDCR, LSEON);
  771. if (val) {
  772. clock_update_hz(s->lse_crystal, LSE_FRQ);
  773. s->bdcr |= R_BDCR_LSERDY_MASK;
  774. if (s->cier & R_CIER_LSERDYIE_MASK) {
  775. s->cifr |= R_CIFR_LSERDYF_MASK;
  776. }
  777. } else {
  778. clock_update(s->lse_crystal, 0);
  779. s->bdcr &= ~R_BDCR_LSERDY_MASK;
  780. }
  781. rcc_update_irq(s);
  782. }
  783. static void rcc_update_csr(Stm32l4x5RccState *s)
  784. {
  785. int val;
  786. /* Reset flags: Not implemented */
  787. /* MSISRANGE: Not implemented after reset */
  788. /* LSION: Update LSIRDY at the same time */
  789. val = FIELD_EX32(s->csr, CSR, LSION);
  790. if (val) {
  791. clock_update_hz(s->lsi_rc, LSI_FRQ);
  792. s->csr |= R_CSR_LSIRDY_MASK;
  793. if (s->cier & R_CIER_LSIRDYIE_MASK) {
  794. s->cifr |= R_CIFR_LSIRDYF_MASK;
  795. }
  796. } else {
  797. /*
  798. * TODO: Handle when the LSI is set independently of LSION.
  799. * E.g. when the LSI is set by the RTC.
  800. * See the reference manual for more details.
  801. */
  802. clock_update(s->lsi_rc, 0);
  803. s->csr &= ~R_CSR_LSIRDY_MASK;
  804. }
  805. rcc_update_irq(s);
  806. }
  807. static void stm32l4x5_rcc_reset_hold(Object *obj, ResetType type)
  808. {
  809. Stm32l4x5RccState *s = STM32L4X5_RCC(obj);
  810. s->cr = 0x00000063;
  811. /*
  812. * Factory-programmed calibration data
  813. * From the reference manual: 0x10XX 00XX
  814. * Value taken from a real card.
  815. */
  816. s->icscr = 0x106E0082;
  817. s->cfgr = 0x0;
  818. s->pllcfgr = 0x00001000;
  819. s->pllsai1cfgr = 0x00001000;
  820. s->pllsai2cfgr = 0x00001000;
  821. s->cier = 0x0;
  822. s->cifr = 0x0;
  823. s->ahb1rstr = 0x0;
  824. s->ahb2rstr = 0x0;
  825. s->ahb3rstr = 0x0;
  826. s->apb1rstr1 = 0x0;
  827. s->apb1rstr2 = 0x0;
  828. s->apb2rstr = 0x0;
  829. s->ahb1enr = 0x00000100;
  830. s->ahb2enr = 0x0;
  831. s->ahb3enr = 0x0;
  832. s->apb1enr1 = 0x0;
  833. s->apb1enr2 = 0x0;
  834. s->apb2enr = 0x0;
  835. s->ahb1smenr = 0x00011303;
  836. s->ahb2smenr = 0x000532FF;
  837. s->ahb3smenr = 0x00000101;
  838. s->apb1smenr1 = 0xF2FECA3F;
  839. s->apb1smenr2 = 0x00000025;
  840. s->apb2smenr = 0x01677C01;
  841. s->ccipr = 0x0;
  842. s->bdcr = 0x0;
  843. s->csr = 0x0C000600;
  844. }
  845. static uint64_t stm32l4x5_rcc_read(void *opaque, hwaddr addr,
  846. unsigned int size)
  847. {
  848. Stm32l4x5RccState *s = opaque;
  849. uint64_t retvalue = 0;
  850. switch (addr) {
  851. case A_CR:
  852. retvalue = s->cr;
  853. break;
  854. case A_ICSCR:
  855. retvalue = s->icscr;
  856. break;
  857. case A_CFGR:
  858. retvalue = s->cfgr;
  859. break;
  860. case A_PLLCFGR:
  861. retvalue = s->pllcfgr;
  862. break;
  863. case A_PLLSAI1CFGR:
  864. retvalue = s->pllsai1cfgr;
  865. break;
  866. case A_PLLSAI2CFGR:
  867. retvalue = s->pllsai2cfgr;
  868. break;
  869. case A_CIER:
  870. retvalue = s->cier;
  871. break;
  872. case A_CIFR:
  873. retvalue = s->cifr;
  874. break;
  875. case A_CICR:
  876. /* CICR is write only, return the reset value = 0 */
  877. break;
  878. case A_AHB1RSTR:
  879. retvalue = s->ahb1rstr;
  880. break;
  881. case A_AHB2RSTR:
  882. retvalue = s->ahb2rstr;
  883. break;
  884. case A_AHB3RSTR:
  885. retvalue = s->ahb3rstr;
  886. break;
  887. case A_APB1RSTR1:
  888. retvalue = s->apb1rstr1;
  889. break;
  890. case A_APB1RSTR2:
  891. retvalue = s->apb1rstr2;
  892. break;
  893. case A_APB2RSTR:
  894. retvalue = s->apb2rstr;
  895. break;
  896. case A_AHB1ENR:
  897. retvalue = s->ahb1enr;
  898. break;
  899. case A_AHB2ENR:
  900. retvalue = s->ahb2enr;
  901. break;
  902. case A_AHB3ENR:
  903. retvalue = s->ahb3enr;
  904. break;
  905. case A_APB1ENR1:
  906. retvalue = s->apb1enr1;
  907. break;
  908. case A_APB1ENR2:
  909. retvalue = s->apb1enr2;
  910. break;
  911. case A_APB2ENR:
  912. retvalue = s->apb2enr;
  913. break;
  914. case A_AHB1SMENR:
  915. retvalue = s->ahb1smenr;
  916. break;
  917. case A_AHB2SMENR:
  918. retvalue = s->ahb2smenr;
  919. break;
  920. case A_AHB3SMENR:
  921. retvalue = s->ahb3smenr;
  922. break;
  923. case A_APB1SMENR1:
  924. retvalue = s->apb1smenr1;
  925. break;
  926. case A_APB1SMENR2:
  927. retvalue = s->apb1smenr2;
  928. break;
  929. case A_APB2SMENR:
  930. retvalue = s->apb2smenr;
  931. break;
  932. case A_CCIPR:
  933. retvalue = s->ccipr;
  934. break;
  935. case A_BDCR:
  936. retvalue = s->bdcr;
  937. break;
  938. case A_CSR:
  939. retvalue = s->csr;
  940. break;
  941. default:
  942. qemu_log_mask(LOG_GUEST_ERROR,
  943. "%s: Bad offset 0x%"HWADDR_PRIx"\n", __func__, addr);
  944. break;
  945. }
  946. trace_stm32l4x5_rcc_read(addr, retvalue);
  947. return retvalue;
  948. }
  949. static void stm32l4x5_rcc_write(void *opaque, hwaddr addr,
  950. uint64_t val64, unsigned int size)
  951. {
  952. Stm32l4x5RccState *s = opaque;
  953. uint32_t previous_value = 0;
  954. const uint32_t value = val64;
  955. trace_stm32l4x5_rcc_write(addr, value);
  956. switch (addr) {
  957. case A_CR:
  958. previous_value = s->cr;
  959. s->cr = (s->cr & CR_READ_SET_MASK) |
  960. (value & (CR_READ_SET_MASK | ~CR_READ_ONLY_MASK));
  961. rcc_update_cr_register(s, previous_value);
  962. break;
  963. case A_ICSCR:
  964. s->icscr = value & ~ICSCR_READ_ONLY_MASK;
  965. qemu_log_mask(LOG_UNIMP,
  966. "%s: Side-effects not implemented for ICSCR\n", __func__);
  967. break;
  968. case A_CFGR:
  969. s->cfgr = value & ~CFGR_READ_ONLY_MASK;
  970. rcc_update_cfgr_register(s);
  971. break;
  972. case A_PLLCFGR:
  973. s->pllcfgr = value;
  974. rcc_update_pllcfgr(s);
  975. break;
  976. case A_PLLSAI1CFGR:
  977. s->pllsai1cfgr = value;
  978. rcc_update_pllsaixcfgr(s, RCC_PLL_PLLSAI1);
  979. break;
  980. case A_PLLSAI2CFGR:
  981. s->pllsai2cfgr = value;
  982. rcc_update_pllsaixcfgr(s, RCC_PLL_PLLSAI2);
  983. break;
  984. case A_CIER:
  985. s->cier = value;
  986. qemu_log_mask(LOG_UNIMP,
  987. "%s: Side-effects not implemented for CIER\n", __func__);
  988. break;
  989. case A_CIFR:
  990. qemu_log_mask(LOG_GUEST_ERROR,
  991. "%s: Write attempt into read-only register (CIFR) 0x%"PRIx32"\n",
  992. __func__, value);
  993. break;
  994. case A_CICR:
  995. /* Clear interrupt flags by writing a 1 to the CICR register */
  996. s->cifr &= ~value;
  997. rcc_update_irq(s);
  998. break;
  999. /* Reset behaviors are not implemented */
  1000. case A_AHB1RSTR:
  1001. s->ahb1rstr = value;
  1002. qemu_log_mask(LOG_UNIMP,
  1003. "%s: Side-effects not implemented for AHB1RSTR\n", __func__);
  1004. break;
  1005. case A_AHB2RSTR:
  1006. s->ahb2rstr = value;
  1007. qemu_log_mask(LOG_UNIMP,
  1008. "%s: Side-effects not implemented for AHB2RSTR\n", __func__);
  1009. break;
  1010. case A_AHB3RSTR:
  1011. s->ahb3rstr = value;
  1012. qemu_log_mask(LOG_UNIMP,
  1013. "%s: Side-effects not implemented for AHB3RSTR\n", __func__);
  1014. break;
  1015. case A_APB1RSTR1:
  1016. s->apb1rstr1 = value;
  1017. qemu_log_mask(LOG_UNIMP,
  1018. "%s: Side-effects not implemented for APB1RSTR1\n", __func__);
  1019. break;
  1020. case A_APB1RSTR2:
  1021. s->apb1rstr2 = value;
  1022. qemu_log_mask(LOG_UNIMP,
  1023. "%s: Side-effects not implemented for APB1RSTR2\n", __func__);
  1024. break;
  1025. case A_APB2RSTR:
  1026. s->apb2rstr = value;
  1027. qemu_log_mask(LOG_UNIMP,
  1028. "%s: Side-effects not implemented for APB2RSTR\n", __func__);
  1029. break;
  1030. case A_AHB1ENR:
  1031. s->ahb1enr = value;
  1032. rcc_update_ahb1enr(s);
  1033. break;
  1034. case A_AHB2ENR:
  1035. s->ahb2enr = value;
  1036. rcc_update_ahb2enr(s);
  1037. break;
  1038. case A_AHB3ENR:
  1039. s->ahb3enr = value;
  1040. rcc_update_ahb3enr(s);
  1041. break;
  1042. case A_APB1ENR1:
  1043. s->apb1enr1 = value;
  1044. rcc_update_apb1enr(s);
  1045. break;
  1046. case A_APB1ENR2:
  1047. s->apb1enr2 = value;
  1048. rcc_update_apb1enr(s);
  1049. break;
  1050. case A_APB2ENR:
  1051. s->apb2enr = (s->apb2enr & APB2ENR_READ_SET_MASK) | value;
  1052. rcc_update_apb2enr(s);
  1053. break;
  1054. /* Behaviors for Sleep and Stop modes are not implemented */
  1055. case A_AHB1SMENR:
  1056. s->ahb1smenr = value;
  1057. qemu_log_mask(LOG_UNIMP,
  1058. "%s: Side-effects not implemented for AHB1SMENR\n", __func__);
  1059. break;
  1060. case A_AHB2SMENR:
  1061. s->ahb2smenr = value;
  1062. qemu_log_mask(LOG_UNIMP,
  1063. "%s: Side-effects not implemented for AHB2SMENR\n", __func__);
  1064. break;
  1065. case A_AHB3SMENR:
  1066. s->ahb3smenr = value;
  1067. qemu_log_mask(LOG_UNIMP,
  1068. "%s: Side-effects not implemented for AHB3SMENR\n", __func__);
  1069. break;
  1070. case A_APB1SMENR1:
  1071. s->apb1smenr1 = value;
  1072. qemu_log_mask(LOG_UNIMP,
  1073. "%s: Side-effects not implemented for APB1SMENR1\n", __func__);
  1074. break;
  1075. case A_APB1SMENR2:
  1076. s->apb1smenr2 = value;
  1077. qemu_log_mask(LOG_UNIMP,
  1078. "%s: Side-effects not implemented for APB1SMENR2\n", __func__);
  1079. break;
  1080. case A_APB2SMENR:
  1081. s->apb2smenr = value;
  1082. qemu_log_mask(LOG_UNIMP,
  1083. "%s: Side-effects not implemented for APB2SMENR\n", __func__);
  1084. break;
  1085. case A_CCIPR:
  1086. s->ccipr = value;
  1087. rcc_update_ccipr(s);
  1088. break;
  1089. case A_BDCR:
  1090. s->bdcr = value & ~BDCR_READ_ONLY_MASK;
  1091. rcc_update_bdcr(s);
  1092. break;
  1093. case A_CSR:
  1094. s->csr = value & ~CSR_READ_ONLY_MASK;
  1095. rcc_update_csr(s);
  1096. break;
  1097. default:
  1098. qemu_log_mask(LOG_GUEST_ERROR,
  1099. "%s: Bad offset 0x%"HWADDR_PRIx"\n", __func__, addr);
  1100. }
  1101. }
  1102. static const MemoryRegionOps stm32l4x5_rcc_ops = {
  1103. .read = stm32l4x5_rcc_read,
  1104. .write = stm32l4x5_rcc_write,
  1105. .endianness = DEVICE_NATIVE_ENDIAN,
  1106. .valid = {
  1107. .max_access_size = 4,
  1108. .min_access_size = 4,
  1109. .unaligned = false
  1110. },
  1111. .impl = {
  1112. .max_access_size = 4,
  1113. .min_access_size = 4,
  1114. .unaligned = false
  1115. },
  1116. };
  1117. static const ClockPortInitArray stm32l4x5_rcc_clocks = {
  1118. QDEV_CLOCK_IN(Stm32l4x5RccState, hsi16_rc, NULL, 0),
  1119. QDEV_CLOCK_IN(Stm32l4x5RccState, msi_rc, NULL, 0),
  1120. QDEV_CLOCK_IN(Stm32l4x5RccState, hse, NULL, 0),
  1121. QDEV_CLOCK_IN(Stm32l4x5RccState, lsi_rc, NULL, 0),
  1122. QDEV_CLOCK_IN(Stm32l4x5RccState, lse_crystal, NULL, 0),
  1123. QDEV_CLOCK_IN(Stm32l4x5RccState, sai1_extclk, NULL, 0),
  1124. QDEV_CLOCK_IN(Stm32l4x5RccState, sai2_extclk, NULL, 0),
  1125. QDEV_CLOCK_END
  1126. };
  1127. static void stm32l4x5_rcc_init(Object *obj)
  1128. {
  1129. Stm32l4x5RccState *s = STM32L4X5_RCC(obj);
  1130. size_t i;
  1131. sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq);
  1132. memory_region_init_io(&s->mmio, obj, &stm32l4x5_rcc_ops, s,
  1133. TYPE_STM32L4X5_RCC, 0x400);
  1134. sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio);
  1135. qdev_init_clocks(DEVICE(s), stm32l4x5_rcc_clocks);
  1136. for (i = 0; i < RCC_NUM_PLL; i++) {
  1137. object_initialize_child(obj, PLL_INIT_INFO[i].name,
  1138. &s->plls[i], TYPE_RCC_PLL);
  1139. set_pll_init_info(&s->plls[i], i);
  1140. }
  1141. for (i = 0; i < RCC_NUM_CLOCK_MUX; i++) {
  1142. char *alias;
  1143. object_initialize_child(obj, CLOCK_MUX_INIT_INFO[i].name,
  1144. &s->clock_muxes[i],
  1145. TYPE_RCC_CLOCK_MUX);
  1146. set_clock_mux_init_info(&s->clock_muxes[i], i);
  1147. if (!CLOCK_MUX_INIT_INFO[i].hidden) {
  1148. /* Expose muxes output as RCC outputs */
  1149. alias = g_strdup_printf("%s-out", CLOCK_MUX_INIT_INFO[i].name);
  1150. qdev_alias_clock(DEVICE(&s->clock_muxes[i]), "out", DEVICE(obj), alias);
  1151. g_free(alias);
  1152. }
  1153. }
  1154. s->gnd = clock_new(obj, "gnd");
  1155. }
  1156. static void connect_mux_sources(Stm32l4x5RccState *s,
  1157. RccClockMuxState *mux,
  1158. const RccClockMuxSource *clk_mapping)
  1159. {
  1160. size_t i;
  1161. Clock * const CLK_SRC_MAPPING[] = {
  1162. [RCC_CLOCK_MUX_SRC_GND] = s->gnd,
  1163. [RCC_CLOCK_MUX_SRC_HSI] = s->hsi16_rc,
  1164. [RCC_CLOCK_MUX_SRC_HSE] = s->hse,
  1165. [RCC_CLOCK_MUX_SRC_MSI] = s->msi_rc,
  1166. [RCC_CLOCK_MUX_SRC_LSI] = s->lsi_rc,
  1167. [RCC_CLOCK_MUX_SRC_LSE] = s->lse_crystal,
  1168. [RCC_CLOCK_MUX_SRC_SAI1_EXTCLK] = s->sai1_extclk,
  1169. [RCC_CLOCK_MUX_SRC_SAI2_EXTCLK] = s->sai2_extclk,
  1170. [RCC_CLOCK_MUX_SRC_PLL] =
  1171. s->plls[RCC_PLL_PLL].channels[RCC_PLL_CHANNEL_PLLCLK],
  1172. [RCC_CLOCK_MUX_SRC_PLLSAI1] =
  1173. s->plls[RCC_PLL_PLLSAI1].channels[RCC_PLLSAI1_CHANNEL_PLLSAI1CLK],
  1174. [RCC_CLOCK_MUX_SRC_PLLSAI2] =
  1175. s->plls[RCC_PLL_PLLSAI2].channels[RCC_PLLSAI2_CHANNEL_PLLSAI2CLK],
  1176. [RCC_CLOCK_MUX_SRC_PLLSAI3] =
  1177. s->plls[RCC_PLL_PLL].channels[RCC_PLL_CHANNEL_PLLSAI3CLK],
  1178. [RCC_CLOCK_MUX_SRC_PLL48M1] =
  1179. s->plls[RCC_PLL_PLL].channels[RCC_PLL_CHANNEL_PLL48M1CLK],
  1180. [RCC_CLOCK_MUX_SRC_PLL48M2] =
  1181. s->plls[RCC_PLL_PLLSAI1].channels[RCC_PLLSAI1_CHANNEL_PLL48M2CLK],
  1182. [RCC_CLOCK_MUX_SRC_PLLADC1] =
  1183. s->plls[RCC_PLL_PLLSAI1].channels[RCC_PLLSAI1_CHANNEL_PLLADC1CLK],
  1184. [RCC_CLOCK_MUX_SRC_PLLADC2] =
  1185. s->plls[RCC_PLL_PLLSAI2] .channels[RCC_PLLSAI2_CHANNEL_PLLADC2CLK],
  1186. [RCC_CLOCK_MUX_SRC_SYSCLK] = s->clock_muxes[RCC_CLOCK_MUX_SYSCLK].out,
  1187. [RCC_CLOCK_MUX_SRC_HCLK] = s->clock_muxes[RCC_CLOCK_MUX_HCLK].out,
  1188. [RCC_CLOCK_MUX_SRC_PCLK1] = s->clock_muxes[RCC_CLOCK_MUX_PCLK1].out,
  1189. [RCC_CLOCK_MUX_SRC_PCLK2] = s->clock_muxes[RCC_CLOCK_MUX_PCLK2].out,
  1190. [RCC_CLOCK_MUX_SRC_HSE_OVER_32] = s->clock_muxes[RCC_CLOCK_MUX_HSE_OVER_32].out,
  1191. [RCC_CLOCK_MUX_SRC_LCD_AND_RTC_COMMON] =
  1192. s->clock_muxes[RCC_CLOCK_MUX_LCD_AND_RTC_COMMON].out,
  1193. };
  1194. assert(ARRAY_SIZE(CLK_SRC_MAPPING) == RCC_CLOCK_MUX_SRC_NUMBER);
  1195. for (i = 0; i < RCC_NUM_CLOCK_MUX_SRC; i++) {
  1196. RccClockMuxSource mapping = clk_mapping[i];
  1197. clock_set_source(mux->srcs[i], CLK_SRC_MAPPING[mapping]);
  1198. }
  1199. }
  1200. static const VMStateDescription vmstate_stm32l4x5_rcc = {
  1201. .name = TYPE_STM32L4X5_RCC,
  1202. .version_id = 1,
  1203. .minimum_version_id = 1,
  1204. .fields = (VMStateField[]) {
  1205. VMSTATE_UINT32(cr, Stm32l4x5RccState),
  1206. VMSTATE_UINT32(icscr, Stm32l4x5RccState),
  1207. VMSTATE_UINT32(cfgr, Stm32l4x5RccState),
  1208. VMSTATE_UINT32(pllcfgr, Stm32l4x5RccState),
  1209. VMSTATE_UINT32(pllsai1cfgr, Stm32l4x5RccState),
  1210. VMSTATE_UINT32(pllsai2cfgr, Stm32l4x5RccState),
  1211. VMSTATE_UINT32(cier, Stm32l4x5RccState),
  1212. VMSTATE_UINT32(cifr, Stm32l4x5RccState),
  1213. VMSTATE_UINT32(ahb1rstr, Stm32l4x5RccState),
  1214. VMSTATE_UINT32(ahb2rstr, Stm32l4x5RccState),
  1215. VMSTATE_UINT32(ahb3rstr, Stm32l4x5RccState),
  1216. VMSTATE_UINT32(apb1rstr1, Stm32l4x5RccState),
  1217. VMSTATE_UINT32(apb1rstr2, Stm32l4x5RccState),
  1218. VMSTATE_UINT32(apb2rstr, Stm32l4x5RccState),
  1219. VMSTATE_UINT32(ahb1enr, Stm32l4x5RccState),
  1220. VMSTATE_UINT32(ahb2enr, Stm32l4x5RccState),
  1221. VMSTATE_UINT32(ahb3enr, Stm32l4x5RccState),
  1222. VMSTATE_UINT32(apb1enr1, Stm32l4x5RccState),
  1223. VMSTATE_UINT32(apb1enr2, Stm32l4x5RccState),
  1224. VMSTATE_UINT32(apb2enr, Stm32l4x5RccState),
  1225. VMSTATE_UINT32(ahb1smenr, Stm32l4x5RccState),
  1226. VMSTATE_UINT32(ahb2smenr, Stm32l4x5RccState),
  1227. VMSTATE_UINT32(ahb3smenr, Stm32l4x5RccState),
  1228. VMSTATE_UINT32(apb1smenr1, Stm32l4x5RccState),
  1229. VMSTATE_UINT32(apb1smenr2, Stm32l4x5RccState),
  1230. VMSTATE_UINT32(apb2smenr, Stm32l4x5RccState),
  1231. VMSTATE_UINT32(ccipr, Stm32l4x5RccState),
  1232. VMSTATE_UINT32(bdcr, Stm32l4x5RccState),
  1233. VMSTATE_UINT32(csr, Stm32l4x5RccState),
  1234. VMSTATE_CLOCK(hsi16_rc, Stm32l4x5RccState),
  1235. VMSTATE_CLOCK(msi_rc, Stm32l4x5RccState),
  1236. VMSTATE_CLOCK(hse, Stm32l4x5RccState),
  1237. VMSTATE_CLOCK(lsi_rc, Stm32l4x5RccState),
  1238. VMSTATE_CLOCK(lse_crystal, Stm32l4x5RccState),
  1239. VMSTATE_CLOCK(sai1_extclk, Stm32l4x5RccState),
  1240. VMSTATE_CLOCK(sai2_extclk, Stm32l4x5RccState),
  1241. VMSTATE_END_OF_LIST()
  1242. }
  1243. };
  1244. static void stm32l4x5_rcc_realize(DeviceState *dev, Error **errp)
  1245. {
  1246. Stm32l4x5RccState *s = STM32L4X5_RCC(dev);
  1247. size_t i;
  1248. if (s->hse_frequency < 4000000ULL ||
  1249. s->hse_frequency > 48000000ULL) {
  1250. error_setg(errp,
  1251. "HSE frequency is outside of the allowed [4-48]Mhz range: %" PRIx64 "",
  1252. s->hse_frequency);
  1253. return;
  1254. }
  1255. for (i = 0; i < RCC_NUM_PLL; i++) {
  1256. RccPllState *pll = &s->plls[i];
  1257. clock_set_source(pll->in, s->clock_muxes[RCC_CLOCK_MUX_PLL_INPUT].out);
  1258. if (!qdev_realize(DEVICE(pll), NULL, errp)) {
  1259. return;
  1260. }
  1261. }
  1262. for (i = 0; i < RCC_NUM_CLOCK_MUX; i++) {
  1263. RccClockMuxState *clock_mux = &s->clock_muxes[i];
  1264. connect_mux_sources(s, clock_mux, CLOCK_MUX_INIT_INFO[i].src_mapping);
  1265. if (!qdev_realize(DEVICE(clock_mux), NULL, errp)) {
  1266. return;
  1267. }
  1268. }
  1269. /*
  1270. * Start clocks after everything is connected
  1271. * to propagate the frequencies along the tree.
  1272. */
  1273. clock_update_hz(s->msi_rc, MSI_DEFAULT_FRQ);
  1274. clock_update_hz(s->sai1_extclk, s->sai1_extclk_frequency);
  1275. clock_update_hz(s->sai2_extclk, s->sai2_extclk_frequency);
  1276. clock_update(s->gnd, 0);
  1277. }
  1278. static const Property stm32l4x5_rcc_properties[] = {
  1279. DEFINE_PROP_UINT64("hse_frequency", Stm32l4x5RccState,
  1280. hse_frequency, HSE_DEFAULT_FRQ),
  1281. DEFINE_PROP_UINT64("sai1_extclk_frequency", Stm32l4x5RccState,
  1282. sai1_extclk_frequency, 0),
  1283. DEFINE_PROP_UINT64("sai2_extclk_frequency", Stm32l4x5RccState,
  1284. sai2_extclk_frequency, 0),
  1285. };
  1286. static void stm32l4x5_rcc_class_init(ObjectClass *klass, void *data)
  1287. {
  1288. DeviceClass *dc = DEVICE_CLASS(klass);
  1289. ResettableClass *rc = RESETTABLE_CLASS(klass);
  1290. assert(ARRAY_SIZE(CLOCK_MUX_INIT_INFO) == RCC_NUM_CLOCK_MUX);
  1291. rc->phases.hold = stm32l4x5_rcc_reset_hold;
  1292. device_class_set_props(dc, stm32l4x5_rcc_properties);
  1293. dc->realize = stm32l4x5_rcc_realize;
  1294. dc->vmsd = &vmstate_stm32l4x5_rcc;
  1295. }
  1296. static const TypeInfo stm32l4x5_rcc_types[] = {
  1297. {
  1298. .name = TYPE_STM32L4X5_RCC,
  1299. .parent = TYPE_SYS_BUS_DEVICE,
  1300. .instance_size = sizeof(Stm32l4x5RccState),
  1301. .instance_init = stm32l4x5_rcc_init,
  1302. .class_init = stm32l4x5_rcc_class_init,
  1303. }, {
  1304. .name = TYPE_RCC_CLOCK_MUX,
  1305. .parent = TYPE_DEVICE,
  1306. .instance_size = sizeof(RccClockMuxState),
  1307. .instance_init = clock_mux_init,
  1308. .class_init = clock_mux_class_init,
  1309. }, {
  1310. .name = TYPE_RCC_PLL,
  1311. .parent = TYPE_DEVICE,
  1312. .instance_size = sizeof(RccPllState),
  1313. .instance_init = pll_init,
  1314. .class_init = pll_class_init,
  1315. }
  1316. };
  1317. DEFINE_TYPES(stm32l4x5_rcc_types)