pnv_occ.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923
  1. /*
  2. * QEMU PowerPC PowerNV Emulation of a few OCC related registers
  3. *
  4. * Copyright (c) 2015-2017, IBM Corporation.
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License, version 2, as
  8. * published by the Free Software Foundation.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #include "qemu/osdep.h"
  19. #include "target/ppc/cpu.h"
  20. #include "qapi/error.h"
  21. #include "qemu/log.h"
  22. #include "qemu/module.h"
  23. #include "hw/irq.h"
  24. #include "hw/qdev-properties.h"
  25. #include "hw/ppc/pnv.h"
  26. #include "hw/ppc/pnv_chip.h"
  27. #include "hw/ppc/pnv_xscom.h"
  28. #include "hw/ppc/pnv_occ.h"
  29. #define P8_HOMER_OPAL_DATA_OFFSET 0x1F8000
  30. #define P9_HOMER_OPAL_DATA_OFFSET 0x0E2000
  31. #define OCB_OCI_OCCMISC 0x4020
  32. #define OCB_OCI_OCCMISC_AND 0x4021
  33. #define OCB_OCI_OCCMISC_OR 0x4022
  34. #define OCCMISC_PSI_IRQ PPC_BIT(0)
  35. #define OCCMISC_IRQ_SHMEM PPC_BIT(3)
  36. /* OCC sensors */
  37. #define OCC_SENSOR_DATA_BLOCK_OFFSET 0x0000
  38. #define OCC_SENSOR_DATA_VALID 0x0001
  39. #define OCC_SENSOR_DATA_VERSION 0x0002
  40. #define OCC_SENSOR_DATA_READING_VERSION 0x0004
  41. #define OCC_SENSOR_DATA_NR_SENSORS 0x0008
  42. #define OCC_SENSOR_DATA_NAMES_OFFSET 0x0010
  43. #define OCC_SENSOR_DATA_READING_PING_OFFSET 0x0014
  44. #define OCC_SENSOR_DATA_READING_PONG_OFFSET 0x000c
  45. #define OCC_SENSOR_DATA_NAME_LENGTH 0x000d
  46. #define OCC_SENSOR_NAME_STRUCTURE_TYPE 0x0023
  47. #define OCC_SENSOR_LOC_CORE 0x0022
  48. #define OCC_SENSOR_LOC_GPU 0x0020
  49. #define OCC_SENSOR_TYPE_POWER 0x0003
  50. #define OCC_SENSOR_NAME 0x0005
  51. #define HWMON_SENSORS_MASK 0x001e
  52. static void pnv_occ_set_misc(PnvOCC *occ, uint64_t val)
  53. {
  54. val &= PPC_BITMASK(0, 18); /* Mask out unimplemented bits */
  55. occ->occmisc = val;
  56. /*
  57. * OCCMISC IRQ bit triggers the interrupt on a 0->1 edge, but not clear
  58. * how that is handled in PSI so it is level-triggered here, which is not
  59. * really correct (but skiboot is okay with it).
  60. */
  61. qemu_set_irq(occ->psi_irq, !!(val & OCCMISC_PSI_IRQ));
  62. }
  63. static void pnv_occ_raise_msg_irq(PnvOCC *occ)
  64. {
  65. pnv_occ_set_misc(occ, occ->occmisc | OCCMISC_PSI_IRQ | OCCMISC_IRQ_SHMEM);
  66. }
  67. static uint64_t pnv_occ_power8_xscom_read(void *opaque, hwaddr addr,
  68. unsigned size)
  69. {
  70. PnvOCC *occ = PNV_OCC(opaque);
  71. uint32_t offset = addr >> 3;
  72. uint64_t val = 0;
  73. switch (offset) {
  74. case OCB_OCI_OCCMISC:
  75. val = occ->occmisc;
  76. break;
  77. default:
  78. qemu_log_mask(LOG_UNIMP, "OCC Unimplemented register: Ox%"
  79. HWADDR_PRIx "\n", addr >> 3);
  80. }
  81. return val;
  82. }
  83. static void pnv_occ_power8_xscom_write(void *opaque, hwaddr addr,
  84. uint64_t val, unsigned size)
  85. {
  86. PnvOCC *occ = PNV_OCC(opaque);
  87. uint32_t offset = addr >> 3;
  88. switch (offset) {
  89. case OCB_OCI_OCCMISC_AND:
  90. pnv_occ_set_misc(occ, occ->occmisc & val);
  91. break;
  92. case OCB_OCI_OCCMISC_OR:
  93. pnv_occ_set_misc(occ, occ->occmisc | val);
  94. break;
  95. case OCB_OCI_OCCMISC:
  96. pnv_occ_set_misc(occ, val);
  97. break;
  98. default:
  99. qemu_log_mask(LOG_UNIMP, "OCC Unimplemented register: Ox%"
  100. HWADDR_PRIx "\n", addr >> 3);
  101. }
  102. }
  103. static uint64_t pnv_occ_common_area_read(void *opaque, hwaddr addr,
  104. unsigned width)
  105. {
  106. switch (addr) {
  107. /*
  108. * occ-sensor sanity check that asserts the sensor
  109. * header block
  110. */
  111. case OCC_SENSOR_DATA_BLOCK_OFFSET:
  112. case OCC_SENSOR_DATA_VALID:
  113. case OCC_SENSOR_DATA_VERSION:
  114. case OCC_SENSOR_DATA_READING_VERSION:
  115. case OCC_SENSOR_DATA_NR_SENSORS:
  116. case OCC_SENSOR_DATA_NAMES_OFFSET:
  117. case OCC_SENSOR_DATA_READING_PING_OFFSET:
  118. case OCC_SENSOR_DATA_READING_PONG_OFFSET:
  119. case OCC_SENSOR_NAME_STRUCTURE_TYPE:
  120. return 1;
  121. case OCC_SENSOR_DATA_NAME_LENGTH:
  122. return 0x30;
  123. case OCC_SENSOR_LOC_CORE:
  124. return 0x0040;
  125. case OCC_SENSOR_TYPE_POWER:
  126. return 0x0080;
  127. case OCC_SENSOR_NAME:
  128. return 0x1000;
  129. case HWMON_SENSORS_MASK:
  130. case OCC_SENSOR_LOC_GPU:
  131. return 0x8e00;
  132. }
  133. return 0;
  134. }
  135. static void pnv_occ_common_area_write(void *opaque, hwaddr addr,
  136. uint64_t val, unsigned width)
  137. {
  138. /* callback function defined to occ common area write */
  139. return;
  140. }
  141. static const MemoryRegionOps pnv_occ_power8_xscom_ops = {
  142. .read = pnv_occ_power8_xscom_read,
  143. .write = pnv_occ_power8_xscom_write,
  144. .valid.min_access_size = 8,
  145. .valid.max_access_size = 8,
  146. .impl.min_access_size = 8,
  147. .impl.max_access_size = 8,
  148. .endianness = DEVICE_BIG_ENDIAN,
  149. };
  150. const MemoryRegionOps pnv_occ_sram_ops = {
  151. .read = pnv_occ_common_area_read,
  152. .write = pnv_occ_common_area_write,
  153. .valid.min_access_size = 1,
  154. .valid.max_access_size = 8,
  155. .impl.min_access_size = 1,
  156. .impl.max_access_size = 8,
  157. .endianness = DEVICE_BIG_ENDIAN,
  158. };
  159. static void pnv_occ_power8_class_init(ObjectClass *klass, void *data)
  160. {
  161. PnvOCCClass *poc = PNV_OCC_CLASS(klass);
  162. DeviceClass *dc = DEVICE_CLASS(klass);
  163. dc->desc = "PowerNV OCC Controller (POWER8)";
  164. poc->opal_shared_memory_offset = P8_HOMER_OPAL_DATA_OFFSET;
  165. poc->opal_shared_memory_version = 0x02;
  166. poc->xscom_size = PNV_XSCOM_OCC_SIZE;
  167. poc->xscom_ops = &pnv_occ_power8_xscom_ops;
  168. }
  169. static const TypeInfo pnv_occ_power8_type_info = {
  170. .name = TYPE_PNV8_OCC,
  171. .parent = TYPE_PNV_OCC,
  172. .instance_size = sizeof(PnvOCC),
  173. .class_init = pnv_occ_power8_class_init,
  174. };
  175. #define P9_OCB_OCI_OCCMISC 0x6080
  176. #define P9_OCB_OCI_OCCMISC_CLEAR 0x6081
  177. #define P9_OCB_OCI_OCCMISC_OR 0x6082
  178. static uint64_t pnv_occ_power9_xscom_read(void *opaque, hwaddr addr,
  179. unsigned size)
  180. {
  181. PnvOCC *occ = PNV_OCC(opaque);
  182. uint32_t offset = addr >> 3;
  183. uint64_t val = 0;
  184. switch (offset) {
  185. case P9_OCB_OCI_OCCMISC:
  186. val = occ->occmisc;
  187. break;
  188. default:
  189. qemu_log_mask(LOG_UNIMP, "OCC Unimplemented register: Ox%"
  190. HWADDR_PRIx "\n", addr >> 3);
  191. }
  192. return val;
  193. }
  194. static void pnv_occ_power9_xscom_write(void *opaque, hwaddr addr,
  195. uint64_t val, unsigned size)
  196. {
  197. PnvOCC *occ = PNV_OCC(opaque);
  198. uint32_t offset = addr >> 3;
  199. switch (offset) {
  200. case P9_OCB_OCI_OCCMISC_CLEAR:
  201. pnv_occ_set_misc(occ, 0);
  202. break;
  203. case P9_OCB_OCI_OCCMISC_OR:
  204. pnv_occ_set_misc(occ, occ->occmisc | val);
  205. break;
  206. case P9_OCB_OCI_OCCMISC:
  207. pnv_occ_set_misc(occ, val);
  208. break;
  209. default:
  210. qemu_log_mask(LOG_UNIMP, "OCC Unimplemented register: Ox%"
  211. HWADDR_PRIx "\n", addr >> 3);
  212. }
  213. }
  214. static const MemoryRegionOps pnv_occ_power9_xscom_ops = {
  215. .read = pnv_occ_power9_xscom_read,
  216. .write = pnv_occ_power9_xscom_write,
  217. .valid.min_access_size = 8,
  218. .valid.max_access_size = 8,
  219. .impl.min_access_size = 8,
  220. .impl.max_access_size = 8,
  221. .endianness = DEVICE_BIG_ENDIAN,
  222. };
  223. static void pnv_occ_power9_class_init(ObjectClass *klass, void *data)
  224. {
  225. PnvOCCClass *poc = PNV_OCC_CLASS(klass);
  226. DeviceClass *dc = DEVICE_CLASS(klass);
  227. dc->desc = "PowerNV OCC Controller (POWER9)";
  228. poc->opal_shared_memory_offset = P9_HOMER_OPAL_DATA_OFFSET;
  229. poc->opal_shared_memory_version = 0x90;
  230. poc->xscom_size = PNV9_XSCOM_OCC_SIZE;
  231. poc->xscom_ops = &pnv_occ_power9_xscom_ops;
  232. assert(!dc->user_creatable);
  233. }
  234. static const TypeInfo pnv_occ_power9_type_info = {
  235. .name = TYPE_PNV9_OCC,
  236. .parent = TYPE_PNV_OCC,
  237. .instance_size = sizeof(PnvOCC),
  238. .class_init = pnv_occ_power9_class_init,
  239. };
  240. static void pnv_occ_power10_class_init(ObjectClass *klass, void *data)
  241. {
  242. PnvOCCClass *poc = PNV_OCC_CLASS(klass);
  243. DeviceClass *dc = DEVICE_CLASS(klass);
  244. dc->desc = "PowerNV OCC Controller (POWER10)";
  245. poc->opal_shared_memory_offset = P9_HOMER_OPAL_DATA_OFFSET;
  246. poc->opal_shared_memory_version = 0xA0;
  247. poc->xscom_size = PNV9_XSCOM_OCC_SIZE;
  248. poc->xscom_ops = &pnv_occ_power9_xscom_ops;
  249. assert(!dc->user_creatable);
  250. }
  251. static const TypeInfo pnv_occ_power10_type_info = {
  252. .name = TYPE_PNV10_OCC,
  253. .parent = TYPE_PNV_OCC,
  254. .class_init = pnv_occ_power10_class_init,
  255. };
  256. static bool occ_init_homer_memory(PnvOCC *occ, Error **errp);
  257. static bool occ_model_tick(PnvOCC *occ);
  258. /* Relatively arbitrary */
  259. #define OCC_POLL_MS 100
  260. static void occ_state_machine_timer(void *opaque)
  261. {
  262. PnvOCC *occ = opaque;
  263. uint64_t next = qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + OCC_POLL_MS;
  264. if (occ_model_tick(occ)) {
  265. timer_mod(&occ->state_machine_timer, next);
  266. }
  267. }
  268. static void pnv_occ_realize(DeviceState *dev, Error **errp)
  269. {
  270. PnvOCC *occ = PNV_OCC(dev);
  271. PnvOCCClass *poc = PNV_OCC_GET_CLASS(occ);
  272. PnvHomer *homer = occ->homer;
  273. assert(homer);
  274. if (!occ_init_homer_memory(occ, errp)) {
  275. return;
  276. }
  277. occ->occmisc = 0;
  278. /* XScom region for OCC registers */
  279. pnv_xscom_region_init(&occ->xscom_regs, OBJECT(dev), poc->xscom_ops,
  280. occ, "xscom-occ", poc->xscom_size);
  281. /* OCC common area mmio region for OCC SRAM registers */
  282. memory_region_init_io(&occ->sram_regs, OBJECT(dev), &pnv_occ_sram_ops,
  283. occ, "occ-common-area",
  284. PNV_OCC_SENSOR_DATA_BLOCK_SIZE);
  285. qdev_init_gpio_out(dev, &occ->psi_irq, 1);
  286. timer_init_ms(&occ->state_machine_timer, QEMU_CLOCK_VIRTUAL,
  287. occ_state_machine_timer, occ);
  288. timer_mod(&occ->state_machine_timer, OCC_POLL_MS);
  289. }
  290. static const Property pnv_occ_properties[] = {
  291. DEFINE_PROP_LINK("homer", PnvOCC, homer, TYPE_PNV_HOMER, PnvHomer *),
  292. };
  293. static void pnv_occ_class_init(ObjectClass *klass, void *data)
  294. {
  295. DeviceClass *dc = DEVICE_CLASS(klass);
  296. dc->realize = pnv_occ_realize;
  297. device_class_set_props(dc, pnv_occ_properties);
  298. dc->user_creatable = false;
  299. }
  300. static const TypeInfo pnv_occ_type_info = {
  301. .name = TYPE_PNV_OCC,
  302. .parent = TYPE_DEVICE,
  303. .instance_size = sizeof(PnvOCC),
  304. .class_init = pnv_occ_class_init,
  305. .class_size = sizeof(PnvOCCClass),
  306. .abstract = true,
  307. };
  308. static void pnv_occ_register_types(void)
  309. {
  310. type_register_static(&pnv_occ_type_info);
  311. type_register_static(&pnv_occ_power8_type_info);
  312. type_register_static(&pnv_occ_power9_type_info);
  313. type_register_static(&pnv_occ_power10_type_info);
  314. }
  315. type_init(pnv_occ_register_types);
  316. /*
  317. * From skiboot/hw/occ.c with following changes:
  318. * - tab to space conversion
  319. * - Type conversions u8->uint8_t s8->int8_t __be16->uint16_t etc
  320. * - __packed -> QEMU_PACKED
  321. */
  322. /* OCC Communication Area for PStates */
  323. #define OPAL_DYNAMIC_DATA_OFFSET 0x0B80
  324. /* relative to HOMER_OPAL_DATA_OFFSET */
  325. #define MAX_PSTATES 256
  326. #define MAX_P8_CORES 12
  327. #define MAX_P9_CORES 24
  328. #define MAX_P10_CORES 32
  329. #define MAX_OPAL_CMD_DATA_LENGTH 4090
  330. #define MAX_OCC_RSP_DATA_LENGTH 8698
  331. #define P8_PIR_CORE_MASK 0xFFF8
  332. #define P9_PIR_QUAD_MASK 0xFFF0
  333. #define P10_PIR_CHIP_MASK 0x0000
  334. #define FREQ_MAX_IN_DOMAIN 0
  335. #define FREQ_MOST_RECENTLY_SET 1
  336. /**
  337. * OCC-OPAL Shared Memory Region
  338. *
  339. * Reference document :
  340. * https://github.com/open-power/docs/blob/master/occ/OCC_OpenPwr_FW_Interfaces.pdf
  341. *
  342. * Supported layout versions:
  343. * - 0x01, 0x02 : P8
  344. * https://github.com/open-power/occ/blob/master_p8/src/occ/proc/proc_pstate.h
  345. *
  346. * - 0x90 : P9
  347. * https://github.com/open-power/occ/blob/master/src/occ_405/proc/proc_pstate.h
  348. * In 0x90 the data is separated into :-
  349. * -- Static Data (struct occ_pstate_table): Data is written once by OCC
  350. * -- Dynamic Data (struct occ_dynamic_data): Data is updated at runtime
  351. *
  352. * struct occ_pstate_table - Pstate table layout
  353. * @valid: Indicates if data is valid
  354. * @version: Layout version [Major/Minor]
  355. * @v2.throttle: Reason for limiting the max pstate
  356. * @v9.occ_role: OCC role (Master/Slave)
  357. * @v#.pstate_min: Minimum pstate ever allowed
  358. * @v#.pstate_nom: Nominal pstate
  359. * @v#.pstate_turbo: Maximum turbo pstate
  360. * @v#.pstate_ultra_turbo: Maximum ultra turbo pstate and the maximum
  361. * pstate ever allowed
  362. * @v#.pstates: Pstate-id and frequency list from Pmax to Pmin
  363. * @v#.pstates.id: Pstate-id
  364. * @v#.pstates.flags: Pstate-flag(reserved)
  365. * @v2.pstates.vdd: Voltage Identifier
  366. * @v2.pstates.vcs: Voltage Identifier
  367. * @v#.pstates.freq_khz: Frequency in KHz
  368. * @v#.core_max[1..N]: Max pstate with N active cores
  369. * @spare/reserved/pad: Unused data
  370. */
  371. struct occ_pstate_table {
  372. uint8_t valid;
  373. uint8_t version;
  374. union QEMU_PACKED {
  375. struct QEMU_PACKED { /* Version 0x01 and 0x02 */
  376. uint8_t throttle;
  377. int8_t pstate_min;
  378. int8_t pstate_nom;
  379. int8_t pstate_turbo;
  380. int8_t pstate_ultra_turbo;
  381. uint8_t spare;
  382. uint64_t reserved;
  383. struct QEMU_PACKED {
  384. int8_t id;
  385. uint8_t flags;
  386. uint8_t vdd;
  387. uint8_t vcs;
  388. uint32_t freq_khz;
  389. } pstates[MAX_PSTATES];
  390. int8_t core_max[MAX_P8_CORES];
  391. uint8_t pad[100];
  392. } v2;
  393. struct QEMU_PACKED { /* Version 0x90 */
  394. uint8_t occ_role;
  395. uint8_t pstate_min;
  396. uint8_t pstate_nom;
  397. uint8_t pstate_turbo;
  398. uint8_t pstate_ultra_turbo;
  399. uint8_t spare;
  400. uint64_t reserved1;
  401. uint64_t reserved2;
  402. struct QEMU_PACKED {
  403. uint8_t id;
  404. uint8_t flags;
  405. uint16_t reserved;
  406. uint32_t freq_khz;
  407. } pstates[MAX_PSTATES];
  408. uint8_t core_max[MAX_P9_CORES];
  409. uint8_t pad[56];
  410. } v9;
  411. struct QEMU_PACKED { /* Version 0xA0 */
  412. uint8_t occ_role;
  413. uint8_t pstate_min;
  414. uint8_t pstate_fixed_freq;
  415. uint8_t pstate_base;
  416. uint8_t pstate_ultra_turbo;
  417. uint8_t pstate_fmax;
  418. uint8_t minor;
  419. uint8_t pstate_bottom_throttle;
  420. uint8_t spare;
  421. uint8_t spare1;
  422. uint32_t reserved_32;
  423. uint64_t reserved_64;
  424. struct QEMU_PACKED {
  425. uint8_t id;
  426. uint8_t valid;
  427. uint16_t reserved;
  428. uint32_t freq_khz;
  429. } pstates[MAX_PSTATES];
  430. uint8_t core_max[MAX_P10_CORES];
  431. uint8_t pad[48];
  432. } v10;
  433. };
  434. } QEMU_PACKED;
  435. /**
  436. * OPAL-OCC Command Response Interface
  437. *
  438. * OPAL-OCC Command Buffer
  439. *
  440. * ---------------------------------------------------------------------
  441. * | OPAL | Cmd | OPAL | | Cmd Data | Cmd Data | OPAL |
  442. * | Cmd | Request | OCC | Reserved | Length | Length | Cmd |
  443. * | Flags | ID | Cmd | | (MSB) | (LSB) | Data... |
  444. * ---------------------------------------------------------------------
  445. * | ….OPAL Command Data up to max of Cmd Data Length 4090 bytes |
  446. * | |
  447. * ---------------------------------------------------------------------
  448. *
  449. * OPAL Command Flag
  450. *
  451. * -----------------------------------------------------------------
  452. * | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
  453. * | (msb) | | | | | | | (lsb) |
  454. * -----------------------------------------------------------------
  455. * |Cmd | | | | | | | |
  456. * |Ready | | | | | | | |
  457. * -----------------------------------------------------------------
  458. *
  459. * struct opal_command_buffer - Defines the layout of OPAL command buffer
  460. * @flag: Provides general status of the command
  461. * @request_id: Token to identify request
  462. * @cmd: Command sent
  463. * @data_size: Command data length
  464. * @data: Command specific data
  465. * @spare: Unused byte
  466. */
  467. struct opal_command_buffer {
  468. uint8_t flag;
  469. uint8_t request_id;
  470. uint8_t cmd;
  471. uint8_t spare;
  472. uint16_t data_size;
  473. uint8_t data[MAX_OPAL_CMD_DATA_LENGTH];
  474. } QEMU_PACKED;
  475. /**
  476. * OPAL-OCC Response Buffer
  477. *
  478. * ---------------------------------------------------------------------
  479. * | OCC | Cmd | OPAL | Response | Rsp Data | Rsp Data | OPAL |
  480. * | Rsp | Request | OCC | Status | Length | Length | Rsp |
  481. * | Flags | ID | Cmd | | (MSB) | (LSB) | Data... |
  482. * ---------------------------------------------------------------------
  483. * | ….OPAL Response Data up to max of Rsp Data Length 8698 bytes |
  484. * | |
  485. * ---------------------------------------------------------------------
  486. *
  487. * OCC Response Flag
  488. *
  489. * -----------------------------------------------------------------
  490. * | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
  491. * | (msb) | | | | | | | (lsb) |
  492. * -----------------------------------------------------------------
  493. * | | | | | | |OCC in | Rsp |
  494. * | | | | | | |progress|Ready |
  495. * -----------------------------------------------------------------
  496. *
  497. * struct occ_response_buffer - Defines the layout of OCC response buffer
  498. * @flag: Provides general status of the response
  499. * @request_id: Token to identify request
  500. * @cmd: Command requested
  501. * @status: Indicates success/failure status of
  502. * the command
  503. * @data_size: Response data length
  504. * @data: Response specific data
  505. */
  506. struct occ_response_buffer {
  507. uint8_t flag;
  508. uint8_t request_id;
  509. uint8_t cmd;
  510. uint8_t status;
  511. uint16_t data_size;
  512. uint8_t data[MAX_OCC_RSP_DATA_LENGTH];
  513. } QEMU_PACKED;
  514. /**
  515. * OCC-OPAL Shared Memory Interface Dynamic Data Vx90
  516. *
  517. * struct occ_dynamic_data - Contains runtime attributes
  518. * @occ_state: Current state of OCC
  519. * @major_version: Major version number
  520. * @minor_version: Minor version number (backwards compatible)
  521. * Version 1 indicates GPU presence populated
  522. * @gpus_present: Bitmask of GPUs present (on systems where GPU
  523. * presence is detected through APSS)
  524. * @cpu_throttle: Reason for limiting the max pstate
  525. * @mem_throttle: Reason for throttling memory
  526. * @quick_pwr_drop: Indicates if QPD is asserted
  527. * @pwr_shifting_ratio: Indicates the current percentage of power to
  528. * take away from the CPU vs GPU when shifting
  529. * power to maintain a power cap. Value of 100
  530. * means take all power from CPU.
  531. * @pwr_cap_type: Indicates type of power cap in effect
  532. * @hard_min_pwr_cap: Hard minimum system power cap in Watts.
  533. * Guaranteed unless hardware failure
  534. * @max_pwr_cap: Maximum allowed system power cap in Watts
  535. * @cur_pwr_cap: Current system power cap
  536. * @soft_min_pwr_cap: Soft powercap minimum. OCC may or may not be
  537. * able to maintain this
  538. * @spare/reserved: Unused data
  539. * @cmd: Opal Command Buffer
  540. * @rsp: OCC Response Buffer
  541. */
  542. struct occ_dynamic_data {
  543. uint8_t occ_state;
  544. uint8_t major_version;
  545. uint8_t minor_version;
  546. uint8_t gpus_present;
  547. union QEMU_PACKED {
  548. struct QEMU_PACKED { /* Version 0x90 */
  549. uint8_t spare1;
  550. } v9;
  551. struct QEMU_PACKED { /* Version 0xA0 */
  552. uint8_t wof_enabled;
  553. } v10;
  554. };
  555. uint8_t cpu_throttle;
  556. uint8_t mem_throttle;
  557. uint8_t quick_pwr_drop;
  558. uint8_t pwr_shifting_ratio;
  559. uint8_t pwr_cap_type;
  560. uint16_t hard_min_pwr_cap;
  561. uint16_t max_pwr_cap;
  562. uint16_t cur_pwr_cap;
  563. uint16_t soft_min_pwr_cap;
  564. uint8_t pad[110];
  565. struct opal_command_buffer cmd;
  566. struct occ_response_buffer rsp;
  567. } QEMU_PACKED;
  568. enum occ_response_status {
  569. OCC_RSP_SUCCESS = 0x00,
  570. OCC_RSP_INVALID_COMMAND = 0x11,
  571. OCC_RSP_INVALID_CMD_DATA_LENGTH = 0x12,
  572. OCC_RSP_INVALID_DATA = 0x13,
  573. OCC_RSP_INTERNAL_ERROR = 0x15,
  574. };
  575. #define OCC_ROLE_SLAVE 0x00
  576. #define OCC_ROLE_MASTER 0x01
  577. #define OCC_FLAG_RSP_READY 0x01
  578. #define OCC_FLAG_CMD_IN_PROGRESS 0x02
  579. #define OPAL_FLAG_CMD_READY 0x80
  580. #define PCAP_MAX_POWER_W 100
  581. #define PCAP_SOFT_MIN_POWER_W 20
  582. #define PCAP_HARD_MIN_POWER_W 10
  583. static bool occ_write_static_data(PnvOCC *occ,
  584. struct occ_pstate_table *static_data,
  585. Error **errp)
  586. {
  587. PnvOCCClass *poc = PNV_OCC_GET_CLASS(occ);
  588. PnvHomer *homer = occ->homer;
  589. hwaddr static_addr = homer->base + poc->opal_shared_memory_offset;
  590. MemTxResult ret;
  591. ret = address_space_write(&address_space_memory, static_addr,
  592. MEMTXATTRS_UNSPECIFIED, static_data,
  593. sizeof(*static_data));
  594. if (ret != MEMTX_OK) {
  595. error_setg(errp, "OCC: cannot write OCC-OPAL static data");
  596. return false;
  597. }
  598. return true;
  599. }
  600. static bool occ_read_dynamic_data(PnvOCC *occ,
  601. struct occ_dynamic_data *dynamic_data,
  602. Error **errp)
  603. {
  604. PnvOCCClass *poc = PNV_OCC_GET_CLASS(occ);
  605. PnvHomer *homer = occ->homer;
  606. hwaddr static_addr = homer->base + poc->opal_shared_memory_offset;
  607. hwaddr dynamic_addr = static_addr + OPAL_DYNAMIC_DATA_OFFSET;
  608. MemTxResult ret;
  609. ret = address_space_read(&address_space_memory, dynamic_addr,
  610. MEMTXATTRS_UNSPECIFIED, dynamic_data,
  611. sizeof(*dynamic_data));
  612. if (ret != MEMTX_OK) {
  613. error_setg(errp, "OCC: cannot read OCC-OPAL dynamic data");
  614. return false;
  615. }
  616. return true;
  617. }
  618. static bool occ_write_dynamic_data(PnvOCC *occ,
  619. struct occ_dynamic_data *dynamic_data,
  620. Error **errp)
  621. {
  622. PnvOCCClass *poc = PNV_OCC_GET_CLASS(occ);
  623. PnvHomer *homer = occ->homer;
  624. hwaddr static_addr = homer->base + poc->opal_shared_memory_offset;
  625. hwaddr dynamic_addr = static_addr + OPAL_DYNAMIC_DATA_OFFSET;
  626. MemTxResult ret;
  627. ret = address_space_write(&address_space_memory, dynamic_addr,
  628. MEMTXATTRS_UNSPECIFIED, dynamic_data,
  629. sizeof(*dynamic_data));
  630. if (ret != MEMTX_OK) {
  631. error_setg(errp, "OCC: cannot write OCC-OPAL dynamic data");
  632. return false;
  633. }
  634. return true;
  635. }
  636. static bool occ_opal_send_response(PnvOCC *occ,
  637. struct occ_dynamic_data *dynamic_data,
  638. enum occ_response_status status,
  639. uint8_t *data, uint16_t datalen)
  640. {
  641. struct opal_command_buffer *cmd = &dynamic_data->cmd;
  642. struct occ_response_buffer *rsp = &dynamic_data->rsp;
  643. rsp->request_id = cmd->request_id;
  644. rsp->cmd = cmd->cmd;
  645. rsp->status = status;
  646. rsp->data_size = cpu_to_be16(datalen);
  647. if (datalen) {
  648. memcpy(rsp->data, data, datalen);
  649. }
  650. if (!occ_write_dynamic_data(occ, dynamic_data, NULL)) {
  651. return false;
  652. }
  653. /* Would be a memory barrier here */
  654. rsp->flag = OCC_FLAG_RSP_READY;
  655. cmd->flag = 0;
  656. if (!occ_write_dynamic_data(occ, dynamic_data, NULL)) {
  657. return false;
  658. }
  659. pnv_occ_raise_msg_irq(occ);
  660. return true;
  661. }
  662. /* Returns error status */
  663. static bool occ_opal_process_command(PnvOCC *occ,
  664. struct occ_dynamic_data *dynamic_data)
  665. {
  666. struct opal_command_buffer *cmd = &dynamic_data->cmd;
  667. struct occ_response_buffer *rsp = &dynamic_data->rsp;
  668. if (rsp->flag == 0) {
  669. /* Spend one "tick" in the in-progress state */
  670. rsp->flag = OCC_FLAG_CMD_IN_PROGRESS;
  671. return occ_write_dynamic_data(occ, dynamic_data, NULL);
  672. } else if (rsp->flag != OCC_FLAG_CMD_IN_PROGRESS) {
  673. return occ_opal_send_response(occ, dynamic_data,
  674. OCC_RSP_INTERNAL_ERROR,
  675. NULL, 0);
  676. }
  677. switch (cmd->cmd) {
  678. case 0xD1: { /* SET_POWER_CAP */
  679. uint16_t data;
  680. if (be16_to_cpu(cmd->data_size) != 2) {
  681. return occ_opal_send_response(occ, dynamic_data,
  682. OCC_RSP_INVALID_CMD_DATA_LENGTH,
  683. (uint8_t *)&dynamic_data->cur_pwr_cap,
  684. 2);
  685. }
  686. data = be16_to_cpu(*(uint16_t *)cmd->data);
  687. if (data == 0) { /* clear power cap */
  688. dynamic_data->pwr_cap_type = 0x00; /* none */
  689. data = PCAP_MAX_POWER_W;
  690. } else {
  691. dynamic_data->pwr_cap_type = 0x02; /* user set in-band */
  692. if (data < PCAP_HARD_MIN_POWER_W) {
  693. data = PCAP_HARD_MIN_POWER_W;
  694. } else if (data > PCAP_MAX_POWER_W) {
  695. data = PCAP_MAX_POWER_W;
  696. }
  697. }
  698. dynamic_data->cur_pwr_cap = cpu_to_be16(data);
  699. return occ_opal_send_response(occ, dynamic_data,
  700. OCC_RSP_SUCCESS,
  701. (uint8_t *)&dynamic_data->cur_pwr_cap, 2);
  702. }
  703. default:
  704. return occ_opal_send_response(occ, dynamic_data,
  705. OCC_RSP_INVALID_COMMAND,
  706. NULL, 0);
  707. }
  708. g_assert_not_reached();
  709. }
  710. static bool occ_model_tick(PnvOCC *occ)
  711. {
  712. struct occ_dynamic_data dynamic_data;
  713. if (!occ_read_dynamic_data(occ, &dynamic_data, NULL)) {
  714. /* Can't move OCC state field to safe because we can't map it! */
  715. qemu_log("OCC: failed to read HOMER data, shutting down OCC\n");
  716. return false;
  717. }
  718. if (dynamic_data.cmd.flag == OPAL_FLAG_CMD_READY) {
  719. if (!occ_opal_process_command(occ, &dynamic_data)) {
  720. qemu_log("OCC: failed to write HOMER data, shutting down OCC\n");
  721. return false;
  722. }
  723. }
  724. return true;
  725. }
  726. static bool occ_init_homer_memory(PnvOCC *occ, Error **errp)
  727. {
  728. PnvOCCClass *poc = PNV_OCC_GET_CLASS(occ);
  729. PnvHomer *homer = occ->homer;
  730. PnvChip *chip = homer->chip;
  731. struct occ_pstate_table static_data;
  732. struct occ_dynamic_data dynamic_data;
  733. int i;
  734. memset(&static_data, 0, sizeof(static_data));
  735. static_data.valid = 1;
  736. static_data.version = poc->opal_shared_memory_version;
  737. switch (poc->opal_shared_memory_version) {
  738. case 0x02:
  739. static_data.v2.throttle = 0;
  740. static_data.v2.pstate_min = -2;
  741. static_data.v2.pstate_nom = -1;
  742. static_data.v2.pstate_turbo = -1;
  743. static_data.v2.pstate_ultra_turbo = 0;
  744. static_data.v2.pstates[0].id = 0;
  745. static_data.v2.pstates[1].freq_khz = cpu_to_be32(4000000);
  746. static_data.v2.pstates[1].id = -1;
  747. static_data.v2.pstates[1].freq_khz = cpu_to_be32(3000000);
  748. static_data.v2.pstates[2].id = -2;
  749. static_data.v2.pstates[2].freq_khz = cpu_to_be32(2000000);
  750. for (i = 0; i < chip->nr_cores; i++) {
  751. static_data.v2.core_max[i] = 1;
  752. }
  753. break;
  754. case 0x90:
  755. if (chip->chip_id == 0) {
  756. static_data.v9.occ_role = OCC_ROLE_MASTER;
  757. } else {
  758. static_data.v9.occ_role = OCC_ROLE_SLAVE;
  759. }
  760. static_data.v9.pstate_min = 2;
  761. static_data.v9.pstate_nom = 1;
  762. static_data.v9.pstate_turbo = 1;
  763. static_data.v9.pstate_ultra_turbo = 0;
  764. static_data.v9.pstates[0].id = 0;
  765. static_data.v9.pstates[0].freq_khz = cpu_to_be32(4000000);
  766. static_data.v9.pstates[1].id = 1;
  767. static_data.v9.pstates[1].freq_khz = cpu_to_be32(3000000);
  768. static_data.v9.pstates[2].id = 2;
  769. static_data.v9.pstates[2].freq_khz = cpu_to_be32(2000000);
  770. for (i = 0; i < chip->nr_cores; i++) {
  771. static_data.v9.core_max[i] = 1;
  772. }
  773. break;
  774. case 0xA0:
  775. if (chip->chip_id == 0) {
  776. static_data.v10.occ_role = OCC_ROLE_MASTER;
  777. } else {
  778. static_data.v10.occ_role = OCC_ROLE_SLAVE;
  779. }
  780. static_data.v10.pstate_min = 4;
  781. static_data.v10.pstate_fixed_freq = 3;
  782. static_data.v10.pstate_base = 2;
  783. static_data.v10.pstate_ultra_turbo = 0;
  784. static_data.v10.pstate_fmax = 1;
  785. static_data.v10.minor = 0x01;
  786. static_data.v10.pstates[0].valid = 1;
  787. static_data.v10.pstates[0].id = 0;
  788. static_data.v10.pstates[0].freq_khz = cpu_to_be32(4200000);
  789. static_data.v10.pstates[1].valid = 1;
  790. static_data.v10.pstates[1].id = 1;
  791. static_data.v10.pstates[1].freq_khz = cpu_to_be32(4000000);
  792. static_data.v10.pstates[2].valid = 1;
  793. static_data.v10.pstates[2].id = 2;
  794. static_data.v10.pstates[2].freq_khz = cpu_to_be32(3800000);
  795. static_data.v10.pstates[3].valid = 1;
  796. static_data.v10.pstates[3].id = 3;
  797. static_data.v10.pstates[3].freq_khz = cpu_to_be32(3000000);
  798. static_data.v10.pstates[4].valid = 1;
  799. static_data.v10.pstates[4].id = 4;
  800. static_data.v10.pstates[4].freq_khz = cpu_to_be32(2000000);
  801. for (i = 0; i < chip->nr_cores; i++) {
  802. static_data.v10.core_max[i] = 1;
  803. }
  804. break;
  805. default:
  806. g_assert_not_reached();
  807. }
  808. if (!occ_write_static_data(occ, &static_data, errp)) {
  809. return false;
  810. }
  811. memset(&dynamic_data, 0, sizeof(dynamic_data));
  812. dynamic_data.occ_state = 0x3; /* active */
  813. dynamic_data.major_version = 0x0;
  814. dynamic_data.hard_min_pwr_cap = cpu_to_be16(PCAP_HARD_MIN_POWER_W);
  815. dynamic_data.max_pwr_cap = cpu_to_be16(PCAP_MAX_POWER_W);
  816. dynamic_data.cur_pwr_cap = cpu_to_be16(PCAP_MAX_POWER_W);
  817. dynamic_data.soft_min_pwr_cap = cpu_to_be16(PCAP_SOFT_MIN_POWER_W);
  818. switch (poc->opal_shared_memory_version) {
  819. case 0xA0:
  820. dynamic_data.minor_version = 0x1;
  821. dynamic_data.v10.wof_enabled = 0x1;
  822. break;
  823. case 0x90:
  824. dynamic_data.minor_version = 0x1;
  825. break;
  826. case 0x02:
  827. dynamic_data.minor_version = 0x0;
  828. break;
  829. default:
  830. g_assert_not_reached();
  831. }
  832. if (!occ_write_dynamic_data(occ, &dynamic_data, errp)) {
  833. return false;
  834. }
  835. return true;
  836. }