0007-sb-intel-lynxpoint-Add-native-PCH-init.patch 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786
  1. From 7378cb4fefc87b9a096bb14820a44f26f3a628f5 Mon Sep 17 00:00:00 2001
  2. From: Angel Pons <th3fanbus@gmail.com>
  3. Date: Fri, 6 May 2022 23:43:46 +0200
  4. Subject: [PATCH 07/26] sb/intel/lynxpoint: Add native PCH init
  5. Implement native PCH initialisation for Lynx Point. This is only needed
  6. when MRC.bin is not used.
  7. Change-Id: I36867bdc8b20000e44ff9d0d7b2c0d63952bd561
  8. Signed-off-by: Angel Pons <th3fanbus@gmail.com>
  9. ---
  10. .../haswell/native_raminit/raminit_native.c | 3 +-
  11. src/southbridge/intel/lynxpoint/Makefile.inc | 1 +
  12. .../intel/lynxpoint/early_pch_native.c | 123 +++++++++
  13. .../intel/lynxpoint/hsio/Makefile.inc | 8 +
  14. src/southbridge/intel/lynxpoint/hsio/common.c | 52 ++++
  15. src/southbridge/intel/lynxpoint/hsio/hsio.h | 46 ++++
  16. .../intel/lynxpoint/hsio/lpt_h_cx.c | 244 ++++++++++++++++++
  17. .../intel/lynxpoint/hsio/lpt_lp_bx.c | 180 +++++++++++++
  18. src/southbridge/intel/lynxpoint/pch.h | 6 +
  19. 9 files changed, 661 insertions(+), 2 deletions(-)
  20. create mode 100644 src/southbridge/intel/lynxpoint/hsio/Makefile.inc
  21. create mode 100644 src/southbridge/intel/lynxpoint/hsio/common.c
  22. create mode 100644 src/southbridge/intel/lynxpoint/hsio/hsio.h
  23. create mode 100644 src/southbridge/intel/lynxpoint/hsio/lpt_h_cx.c
  24. create mode 100644 src/southbridge/intel/lynxpoint/hsio/lpt_lp_bx.c
  25. diff --git a/src/northbridge/intel/haswell/native_raminit/raminit_native.c b/src/northbridge/intel/haswell/native_raminit/raminit_native.c
  26. index dd1f1ec14e..b6efb6b40d 100644
  27. --- a/src/northbridge/intel/haswell/native_raminit/raminit_native.c
  28. +++ b/src/northbridge/intel/haswell/native_raminit/raminit_native.c
  29. @@ -16,8 +16,7 @@ static bool early_init_native(int s3resume)
  30. /** TODO: CPU replacement check must be skipped in warm boots and S3 resumes **/
  31. const bool cpu_replaced = !s3resume && intel_early_me_cpu_replacement_check();
  32. - early_thermal_init();
  33. - early_usb_init();
  34. + early_pch_init_native(s3resume);
  35. if (!CONFIG(INTEL_LYNXPOINT_LP))
  36. dmi_early_init();
  37. diff --git a/src/southbridge/intel/lynxpoint/Makefile.inc b/src/southbridge/intel/lynxpoint/Makefile.inc
  38. index a9a9b153d6..63243ecc86 100644
  39. --- a/src/southbridge/intel/lynxpoint/Makefile.inc
  40. +++ b/src/southbridge/intel/lynxpoint/Makefile.inc
  41. @@ -38,6 +38,7 @@ romstage-y += early_usb.c early_me.c me_status.c early_pch.c
  42. romstage-y += pmutil.c
  43. romstage-$(CONFIG_USE_NATIVE_RAMINIT) += early_pch_native.c early_usb_native.c iobp.c thermal.c
  44. +subdirs-$(CONFIG_USE_NATIVE_RAMINIT) += hsio
  45. ifeq ($(CONFIG_INTEL_LYNXPOINT_LP),y)
  46. romstage-y += lp_gpio.c
  47. diff --git a/src/southbridge/intel/lynxpoint/early_pch_native.c b/src/southbridge/intel/lynxpoint/early_pch_native.c
  48. index c28ddfcf5d..421821fa5d 100644
  49. --- a/src/southbridge/intel/lynxpoint/early_pch_native.c
  50. +++ b/src/southbridge/intel/lynxpoint/early_pch_native.c
  51. @@ -1,10 +1,133 @@
  52. /* SPDX-License-Identifier: GPL-2.0-or-later */
  53. #include <console/console.h>
  54. +#include <device/pci_def.h>
  55. #include <device/pci_ops.h>
  56. +#include <southbridge/intel/lynxpoint/hsio/hsio.h>
  57. #include <southbridge/intel/lynxpoint/pch.h>
  58. #include <types.h>
  59. +static void early_sata_init(const uint8_t pch_revision)
  60. +{
  61. + const bool is_mobile = get_pch_platform_type() != PCH_TYPE_DESKTOP;
  62. +
  63. + const uint8_t lane_owner = pci_read_config8(PCI_DEV(0, 0x1c, 0), 0x410);
  64. + printk(BIOS_DEBUG, "HSIO lane owner: 0x%02x\n", lane_owner);
  65. +
  66. + /* BWG Step 2 */
  67. + pci_update_config32(PCH_SATA_DEV, SATA_SCLKG, ~0x1ff, 0x183);
  68. +
  69. + /* BWG Step 3: Set OOB Retry Mode */
  70. + pci_or_config16(PCH_SATA_DEV, SATA_PCS, 1 << 15);
  71. +
  72. + /* BWG Step 4: Program the SATA mPHY tables */
  73. + if (pch_is_lp()) {
  74. + if (pch_revision >= LPT_LP_STEP_B0 && pch_revision <= LPT_LP_STEP_B2) {
  75. + program_hsio_sata_lpt_lp_bx(is_mobile);
  76. + } else {
  77. + printk(BIOS_ERR, "Unsupported PCH-LP stepping 0x%02x\n", pch_revision);
  78. + }
  79. + } else {
  80. + if (pch_revision >= LPT_H_STEP_C0) {
  81. + program_hsio_sata_lpt_h_cx(is_mobile);
  82. + } else {
  83. + printk(BIOS_ERR, "Unsupported PCH-H stepping 0x%02x\n", pch_revision);
  84. + }
  85. + }
  86. +
  87. + /** FIXME: Program SATA RxEq tables **/
  88. +
  89. + /* BWG Step 5 */
  90. + /** FIXME: Only for desktop and mobile (skip this on workstation and server) **/
  91. + pci_or_config32(PCH_SATA_DEV, 0x98, BIT(22));
  92. +
  93. + /* BWG Step 6 */
  94. + pci_or_config32(PCH_SATA_DEV, 0x98, BIT(19));
  95. +
  96. + /* BWG Step 7 */
  97. + pci_update_config32(PCH_SATA_DEV, 0x98, ~(0x3f << 7), 0x04 << 7);
  98. +
  99. + /* BWG Step 8 */
  100. + pci_or_config32(PCH_SATA_DEV, 0x98, BIT(20));
  101. +
  102. + /* BWG Step 9 */
  103. + pci_update_config32(PCH_SATA_DEV, 0x98, ~(3 << 5), 1 << 5);
  104. +
  105. + /* BWG Step 10 */
  106. + pci_or_config32(PCH_SATA_DEV, 0x98, BIT(18));
  107. +
  108. + /* Enable SATA ports */
  109. + uint8_t sata_pcs = 0;
  110. + if (CONFIG(INTEL_LYNXPOINT_LP)) {
  111. + for (uint8_t i = 0; i < 4; i++) {
  112. + if ((lane_owner & BIT(7 - i)) == 0) {
  113. + sata_pcs |= BIT(i);
  114. + }
  115. + }
  116. + } else {
  117. + sata_pcs |= 0x0f;
  118. + for (uint8_t i = 4; i < 6; i++) {
  119. + if ((lane_owner & BIT(i)) == 0) {
  120. + sata_pcs |= BIT(i);
  121. + }
  122. + }
  123. + }
  124. + printk(BIOS_DEBUG, "SATA port enables: 0x%02x\n", sata_pcs);
  125. + pci_or_config8(PCH_SATA_DEV, SATA_PCS, sata_pcs);
  126. +}
  127. +
  128. +void early_pch_init_native(int s3resume)
  129. +{
  130. + const uint8_t pch_revision = pci_read_config8(PCH_LPC_DEV, PCI_REVISION_ID);
  131. +
  132. + RCBA16(DISPBDF) = 0x0010;
  133. + RCBA32_OR(FD2, PCH_ENABLE_DBDF);
  134. +
  135. + /** FIXME: Check GEN_PMCON_3 and handle RTC failure? **/
  136. +
  137. + RCBA32(PRSTS) = BIT(4);
  138. +
  139. + early_sata_init(pch_revision);
  140. +
  141. + pci_or_config8(PCH_LPC_DEV, 0xa6, 1 << 1);
  142. + pci_and_config8(PCH_LPC_DEV, 0xdc, ~(1 << 5 | 1 << 1));
  143. +
  144. + /** TODO: Send GET HSIO VER and update ChipsetInit table? Is it needed? **/
  145. +
  146. + /** FIXME: GbE handling? **/
  147. +
  148. + pci_update_config32(PCH_LPC_DEV, 0xac, ~(1 << 20), 0);
  149. +
  150. + for (uint8_t i = 0; i < 8; i++)
  151. + pci_update_config32(PCI_DEV(0, 0x1c, i), 0x338, ~(1 << 26), 0);
  152. +
  153. + pci_update_config8(PCI_DEV(0, 0x1c, 0), 0xf4, ~(3 << 5), 1 << 7);
  154. +
  155. + pci_update_config8(PCI_DEV(0, 26, 0), 0x88, ~(1 << 2), 0);
  156. + pci_update_config8(PCI_DEV(0, 29, 0), 0x88, ~(1 << 2), 0);
  157. +
  158. + /** FIXME: Disable SATA2 device? **/
  159. +
  160. + if (pch_is_lp()) {
  161. + if (pch_revision >= LPT_LP_STEP_B0 && pch_revision <= LPT_LP_STEP_B2) {
  162. + program_hsio_xhci_lpt_lp_bx();
  163. + program_hsio_igbe_lpt_lp_bx();
  164. + } else {
  165. + printk(BIOS_ERR, "Unsupported PCH-LP stepping 0x%02x\n", pch_revision);
  166. + }
  167. + } else {
  168. + if (pch_revision >= LPT_H_STEP_C0) {
  169. + program_hsio_xhci_lpt_h_cx();
  170. + program_hsio_igbe_lpt_h_cx();
  171. + } else {
  172. + printk(BIOS_ERR, "Unsupported PCH-H stepping 0x%02x\n", pch_revision);
  173. + }
  174. + }
  175. +
  176. + early_thermal_init();
  177. + early_usb_init();
  178. +}
  179. +
  180. void pch_dmi_setup_physical_layer(void)
  181. {
  182. /* FIXME: We need to make sure the SA supports Gen2 as well */
  183. diff --git a/src/southbridge/intel/lynxpoint/hsio/Makefile.inc b/src/southbridge/intel/lynxpoint/hsio/Makefile.inc
  184. new file mode 100644
  185. index 0000000000..6b74997511
  186. --- /dev/null
  187. +++ b/src/southbridge/intel/lynxpoint/hsio/Makefile.inc
  188. @@ -0,0 +1,8 @@
  189. +## SPDX-License-Identifier: GPL-2.0-or-later
  190. +
  191. +romstage-y += common.c
  192. +ifeq ($(CONFIG_INTEL_LYNXPOINT_LP),y)
  193. +romstage-y += lpt_lp_bx.c
  194. +else
  195. +romstage-y += lpt_h_cx.c
  196. +endif
  197. diff --git a/src/southbridge/intel/lynxpoint/hsio/common.c b/src/southbridge/intel/lynxpoint/hsio/common.c
  198. new file mode 100644
  199. index 0000000000..9935ca347a
  200. --- /dev/null
  201. +++ b/src/southbridge/intel/lynxpoint/hsio/common.c
  202. @@ -0,0 +1,52 @@
  203. +/* SPDX-License-Identifier: GPL-2.0-or-later */
  204. +
  205. +#include <device/pci_ops.h>
  206. +#include <southbridge/intel/lynxpoint/hsio/hsio.h>
  207. +#include <types.h>
  208. +
  209. +/*
  210. + * FIXME: Ask Intel whether all lanes need to be programmed as specified
  211. + * in the PCH BWG. If not, make separate tables and only check this once.
  212. + */
  213. +void hsio_sata_shared_update(const uint32_t addr, const uint32_t and, const uint32_t or)
  214. +{
  215. + const uint8_t lane_owner = pci_read_config8(PCI_DEV(0, 0x1c, 0), 0x410);
  216. +
  217. + if ((addr & 0xfe00) == 0x2000 && (lane_owner & (1 << 4)))
  218. + return;
  219. +
  220. + if ((addr & 0xfe00) == 0x2200 && (lane_owner & (1 << 5)))
  221. + return;
  222. +
  223. + if (CONFIG(INTEL_LYNXPOINT_LP)) {
  224. + if ((addr & 0xfe00) == 0x2400 && (lane_owner & (1 << 6)))
  225. + return;
  226. +
  227. + if ((addr & 0xfe00) == 0x2600 && (lane_owner & (1 << 7)))
  228. + return;
  229. + }
  230. + hsio_update(addr, and, or);
  231. +}
  232. +
  233. +/*
  234. + * FIXME: Ask Intel whether all lanes need to be programmed as specified
  235. + * in the PCH BWG. If not, make separate tables and only check this once.
  236. + */
  237. +void hsio_xhci_shared_update(const uint32_t addr, const uint32_t and, const uint32_t or)
  238. +{
  239. + const uint8_t lane_owner = pci_read_config8(PCI_DEV(0, 0x1c, 0), 0x410);
  240. + if (CONFIG(INTEL_LYNXPOINT_LP)) {
  241. + if ((addr & 0xfe00) == 0x2400 && ((lane_owner >> 0) & 3) != 2)
  242. + return;
  243. +
  244. + if ((addr & 0xfe00) == 0x2600 && ((lane_owner >> 2) & 3) != 2)
  245. + return;
  246. + } else {
  247. + if ((addr & 0xfe00) == 0x2c00 && ((lane_owner >> 2) & 3) != 2)
  248. + return;
  249. +
  250. + if ((addr & 0xfe00) == 0x2e00 && ((lane_owner >> 0) & 3) != 2)
  251. + return;
  252. + }
  253. + hsio_update(addr, and, or);
  254. +}
  255. diff --git a/src/southbridge/intel/lynxpoint/hsio/hsio.h b/src/southbridge/intel/lynxpoint/hsio/hsio.h
  256. new file mode 100644
  257. index 0000000000..689ef4a05b
  258. --- /dev/null
  259. +++ b/src/southbridge/intel/lynxpoint/hsio/hsio.h
  260. @@ -0,0 +1,46 @@
  261. +/* SPDX-License-Identifier: GPL-2.0-or-later */
  262. +
  263. +#ifndef SOUTHBRIDGE_INTEL_LYNXPOINT_HSIO_H
  264. +#define SOUTHBRIDGE_INTEL_LYNXPOINT_HSIO_H
  265. +
  266. +#include <southbridge/intel/lynxpoint/iobp.h>
  267. +#include <types.h>
  268. +
  269. +struct hsio_table_row {
  270. + uint32_t addr;
  271. + uint32_t and;
  272. + uint32_t or;
  273. +};
  274. +
  275. +static inline void hsio_update(const uint32_t addr, const uint32_t and, const uint32_t or)
  276. +{
  277. + pch_iobp_update(addr, and, or);
  278. +}
  279. +
  280. +static inline void hsio_update_row(const struct hsio_table_row row)
  281. +{
  282. + hsio_update(row.addr, row.and, row.or);
  283. +}
  284. +
  285. +void hsio_xhci_shared_update(const uint32_t addr, const uint32_t and, const uint32_t or);
  286. +void hsio_sata_shared_update(const uint32_t addr, const uint32_t and, const uint32_t or);
  287. +
  288. +static inline void hsio_sata_shared_update_row(const struct hsio_table_row row)
  289. +{
  290. + hsio_sata_shared_update(row.addr, row.and, row.or);
  291. +}
  292. +
  293. +static inline void hsio_xhci_shared_update_row(const struct hsio_table_row row)
  294. +{
  295. + hsio_xhci_shared_update(row.addr, row.and, row.or);
  296. +}
  297. +
  298. +void program_hsio_sata_lpt_h_cx(const bool is_mobile);
  299. +void program_hsio_xhci_lpt_h_cx(void);
  300. +void program_hsio_igbe_lpt_h_cx(void);
  301. +
  302. +void program_hsio_sata_lpt_lp_bx(const bool is_mobile);
  303. +void program_hsio_xhci_lpt_lp_bx(void);
  304. +void program_hsio_igbe_lpt_lp_bx(void);
  305. +
  306. +#endif
  307. diff --git a/src/southbridge/intel/lynxpoint/hsio/lpt_h_cx.c b/src/southbridge/intel/lynxpoint/hsio/lpt_h_cx.c
  308. new file mode 100644
  309. index 0000000000..b5dd402742
  310. --- /dev/null
  311. +++ b/src/southbridge/intel/lynxpoint/hsio/lpt_h_cx.c
  312. @@ -0,0 +1,244 @@
  313. +/* SPDX-License-Identifier: GPL-2.0-or-later */
  314. +
  315. +#include <device/pci_ops.h>
  316. +#include <southbridge/intel/lynxpoint/hsio/hsio.h>
  317. +#include <types.h>
  318. +
  319. +const struct hsio_table_row hsio_sata_shared_lpt_h_cx[] = {
  320. + { 0xea002008, ~0xfffc6108, 0xea6c6108 },
  321. + { 0xea002208, ~0xfffc6108, 0xea6c6108 },
  322. + { 0xea002038, ~0x3f00000f, 0x0700000d },
  323. + { 0xea002238, ~0x3f00000f, 0x0700000d },
  324. + { 0xea00202c, ~0x00020f00, 0x00020100 },
  325. + { 0xea00222c, ~0x00020f00, 0x00020100 },
  326. + { 0xea002040, ~0x1f000000, 0x01000000 },
  327. + { 0xea002240, ~0x1f000000, 0x01000000 },
  328. + { 0xea002010, ~0xffff0000, 0x0d510000 },
  329. + { 0xea002210, ~0xffff0000, 0x0d510000 },
  330. + { 0xea002018, ~0xffff0300, 0x38250100 },
  331. + { 0xea002218, ~0xffff0300, 0x38250100 },
  332. + { 0xea002000, ~0xcf030000, 0xcf030000 },
  333. + { 0xea002200, ~0xcf030000, 0xcf030000 },
  334. + { 0xea002028, ~0xff1f0000, 0x580e0000 },
  335. + { 0xea002228, ~0xff1f0000, 0x580e0000 },
  336. + { 0xea00201c, ~0x00007c00, 0x00002400 },
  337. + { 0xea00221c, ~0x00007c00, 0x00002400 },
  338. + { 0xea00208c, ~0x00ff0000, 0x00800000 },
  339. + { 0xea00228c, ~0x00ff0000, 0x00800000 },
  340. + { 0xea0020a4, ~0x0030ff00, 0x00308300 },
  341. + { 0xea0022a4, ~0x0030ff00, 0x00308300 },
  342. + { 0xea0020ac, ~0x00000030, 0x00000020 },
  343. + { 0xea0022ac, ~0x00000030, 0x00000020 },
  344. + { 0xea002140, ~0x00ffffff, 0x00140718 },
  345. + { 0xea002340, ~0x00ffffff, 0x00140718 },
  346. + { 0xea002144, ~0x00ffffff, 0x00140998 },
  347. + { 0xea002344, ~0x00ffffff, 0x00140998 },
  348. + { 0xea002148, ~0x00ffffff, 0x00140998 },
  349. + { 0xea002348, ~0x00ffffff, 0x00140998 },
  350. + { 0xea00217c, ~0x03000000, 0x03000000 },
  351. + { 0xea00237c, ~0x03000000, 0x03000000 },
  352. + { 0xea002178, ~0x00001f00, 0x00001800 },
  353. + { 0xea002378, ~0x00001f00, 0x00001800 },
  354. + { 0xea00210c, ~0x0038000f, 0x00000005 },
  355. + { 0xea00230c, ~0x0038000f, 0x00000005 },
  356. +};
  357. +
  358. +const struct hsio_table_row hsio_sata_lpt_h_cx[] = {
  359. + { 0xea008008, ~0xff000000, 0x1c000000 },
  360. + { 0xea002408, ~0xfffc6108, 0xea6c6108 },
  361. + { 0xea002608, ~0xfffc6108, 0xea6c6108 },
  362. + { 0xea000808, ~0xfffc6108, 0xea6c6108 },
  363. + { 0xea000a08, ~0xfffc6108, 0xea6c6108 },
  364. + { 0xea002438, ~0x3f00000f, 0x0700000d },
  365. + { 0xea002638, ~0x3f00000f, 0x0700000d },
  366. + { 0xea000838, ~0x3f00000f, 0x0700000d },
  367. + { 0xea000a38, ~0x3f00000f, 0x0700000d },
  368. + { 0xea002440, ~0x1f000000, 0x01000000 },
  369. + { 0xea002640, ~0x1f000000, 0x01000000 },
  370. + { 0xea000840, ~0x1f000000, 0x01000000 },
  371. + { 0xea000a40, ~0x1f000000, 0x01000000 },
  372. + { 0xea002410, ~0xffff0000, 0x0d510000 },
  373. + { 0xea002610, ~0xffff0000, 0x0d510000 },
  374. + { 0xea000810, ~0xffff0000, 0x0d510000 },
  375. + { 0xea000a10, ~0xffff0000, 0x0d510000 },
  376. + { 0xea00242c, ~0x00020800, 0x00020000 },
  377. + { 0xea00262c, ~0x00020800, 0x00020000 },
  378. + { 0xea00082c, ~0x00020800, 0x00020000 },
  379. + { 0xea000a2c, ~0x00020800, 0x00020000 },
  380. + { 0xea002418, ~0xffff0300, 0x38250100 },
  381. + { 0xea002618, ~0xffff0300, 0x38250100 },
  382. + { 0xea000818, ~0xffff0300, 0x38250100 },
  383. + { 0xea000a18, ~0xffff0300, 0x38250100 },
  384. + { 0xea002400, ~0xcf030000, 0xcf030000 },
  385. + { 0xea002600, ~0xcf030000, 0xcf030000 },
  386. + { 0xea000800, ~0xcf030000, 0xcf030000 },
  387. + { 0xea000a00, ~0xcf030000, 0xcf030000 },
  388. + { 0xea002428, ~0xff1f0000, 0x580e0000 },
  389. + { 0xea002628, ~0xff1f0000, 0x580e0000 },
  390. + { 0xea000828, ~0xff1f0000, 0x580e0000 },
  391. + { 0xea000a28, ~0xff1f0000, 0x580e0000 },
  392. + { 0xea00241c, ~0x00007c00, 0x00002400 },
  393. + { 0xea00261c, ~0x00007c00, 0x00002400 },
  394. + { 0xea00081c, ~0x00007c00, 0x00002400 },
  395. + { 0xea000a1c, ~0x00007c00, 0x00002400 },
  396. + { 0xea00248c, ~0x00ff0000, 0x00800000 },
  397. + { 0xea00268c, ~0x00ff0000, 0x00800000 },
  398. + { 0xea00088c, ~0x00ff0000, 0x00800000 },
  399. + { 0xea000a8c, ~0x00ff0000, 0x00800000 },
  400. + { 0xea0024a4, ~0x0030ff00, 0x00308300 },
  401. + { 0xea0026a4, ~0x0030ff00, 0x00308300 },
  402. + { 0xea0008a4, ~0x0030ff00, 0x00308300 },
  403. + { 0xea000aa4, ~0x0030ff00, 0x00308300 },
  404. + { 0xea0024ac, ~0x00000030, 0x00000020 },
  405. + { 0xea0026ac, ~0x00000030, 0x00000020 },
  406. + { 0xea0008ac, ~0x00000030, 0x00000020 },
  407. + { 0xea000aac, ~0x00000030, 0x00000020 },
  408. + { 0xea002540, ~0x00ffffff, 0x00140718 },
  409. + { 0xea002740, ~0x00ffffff, 0x00140718 },
  410. + { 0xea000940, ~0x00ffffff, 0x00140718 },
  411. + { 0xea000b40, ~0x00ffffff, 0x00140718 },
  412. + { 0xea002544, ~0x00ffffff, 0x00140998 },
  413. + { 0xea002744, ~0x00ffffff, 0x00140998 },
  414. + { 0xea000944, ~0x00ffffff, 0x00140998 },
  415. + { 0xea000b44, ~0x00ffffff, 0x00140998 },
  416. + { 0xea002548, ~0x00ffffff, 0x00140998 },
  417. + { 0xea002748, ~0x00ffffff, 0x00140998 },
  418. + { 0xea000948, ~0x00ffffff, 0x00140998 },
  419. + { 0xea000b48, ~0x00ffffff, 0x00140998 },
  420. + { 0xea00257c, ~0x03000000, 0x03000000 },
  421. + { 0xea00277c, ~0x03000000, 0x03000000 },
  422. + { 0xea00097c, ~0x03000000, 0x03000000 },
  423. + { 0xea000b7c, ~0x03000000, 0x03000000 },
  424. + { 0xea002578, ~0x00001f00, 0x00001800 },
  425. + { 0xea002778, ~0x00001f00, 0x00001800 },
  426. + { 0xea000978, ~0x00001f00, 0x00001800 },
  427. + { 0xea000b78, ~0x00001f00, 0x00001800 },
  428. + { 0xea00250c, ~0x0038000f, 0x00000005 },
  429. + { 0xea00270c, ~0x0038000f, 0x00000005 },
  430. + { 0xea00090c, ~0x0038000f, 0x00000005 },
  431. + { 0xea000b0c, ~0x0038000f, 0x00000005 },
  432. +};
  433. +
  434. +const struct hsio_table_row hsio_xhci_shared_lpt_h_cx[] = {
  435. + { 0xe9002c2c, ~0x00000700, 0x00000100 },
  436. + { 0xe9002e2c, ~0x00000700, 0x00000100 },
  437. + { 0xe9002dcc, ~0x00001407, 0x00001407 },
  438. + { 0xe9002fcc, ~0x00001407, 0x00001407 },
  439. + { 0xe9002d68, ~0x01000f3c, 0x00000a28 },
  440. + { 0xe9002f68, ~0x01000f3c, 0x00000a28 },
  441. + { 0xe9002d6c, ~0x000000ff, 0x0000003f },
  442. + { 0xe9002f6c, ~0x000000ff, 0x0000003f },
  443. + { 0xe9002d4c, ~0x00ffff00, 0x00120500 },
  444. + { 0xe9002f4c, ~0x00ffff00, 0x00120500 },
  445. + { 0xe9002d14, ~0x38000700, 0x00000100 },
  446. + { 0xe9002f14, ~0x38000700, 0x00000100 },
  447. + { 0xe9002d64, ~0x0000f000, 0x00005000 },
  448. + { 0xe9002f64, ~0x0000f000, 0x00005000 },
  449. + { 0xe9002d70, ~0x00000018, 0x00000000 },
  450. + { 0xe9002f70, ~0x00000018, 0x00000000 },
  451. + { 0xe9002c38, ~0x3f00000f, 0x0700000b },
  452. + { 0xe9002e38, ~0x3f00000f, 0x0700000b },
  453. + { 0xe9002d40, ~0x00800000, 0x00000000 },
  454. + { 0xe9002f40, ~0x00800000, 0x00000000 },
  455. +};
  456. +
  457. +const struct hsio_table_row hsio_xhci_lpt_h_cx[] = {
  458. + { 0xe90031cc, ~0x00001407, 0x00001407 },
  459. + { 0xe90033cc, ~0x00001407, 0x00001407 },
  460. + { 0xe90015cc, ~0x00001407, 0x00001407 },
  461. + { 0xe90017cc, ~0x00001407, 0x00001407 },
  462. + { 0xe9003168, ~0x01000f3c, 0x00000a28 },
  463. + { 0xe9003368, ~0x01000f3c, 0x00000a28 },
  464. + { 0xe9001568, ~0x01000f3c, 0x00000a28 },
  465. + { 0xe9001768, ~0x01000f3c, 0x00000a28 },
  466. + { 0xe900316c, ~0x000000ff, 0x0000003f },
  467. + { 0xe900336c, ~0x000000ff, 0x0000003f },
  468. + { 0xe900156c, ~0x000000ff, 0x0000003f },
  469. + { 0xe900176c, ~0x000000ff, 0x0000003f },
  470. + { 0xe900314c, ~0x00ffff00, 0x00120500 },
  471. + { 0xe900334c, ~0x00ffff00, 0x00120500 },
  472. + { 0xe900154c, ~0x00ffff00, 0x00120500 },
  473. + { 0xe900174c, ~0x00ffff00, 0x00120500 },
  474. + { 0xe9003114, ~0x38000700, 0x00000100 },
  475. + { 0xe9003314, ~0x38000700, 0x00000100 },
  476. + { 0xe9001514, ~0x38000700, 0x00000100 },
  477. + { 0xe9001714, ~0x38000700, 0x00000100 },
  478. + { 0xe9003164, ~0x0000f000, 0x00005000 },
  479. + { 0xe9003364, ~0x0000f000, 0x00005000 },
  480. + { 0xe9001564, ~0x0000f000, 0x00005000 },
  481. + { 0xe9001764, ~0x0000f000, 0x00005000 },
  482. + { 0xe9003170, ~0x00000018, 0x00000000 },
  483. + { 0xe9003370, ~0x00000018, 0x00000000 },
  484. + { 0xe9001570, ~0x00000018, 0x00000000 },
  485. + { 0xe9001770, ~0x00000018, 0x00000000 },
  486. + { 0xe9003038, ~0x3f00000f, 0x0700000b },
  487. + { 0xe9003238, ~0x3f00000f, 0x0700000b },
  488. + { 0xe9001438, ~0x3f00000f, 0x0700000b },
  489. + { 0xe9001638, ~0x3f00000f, 0x0700000b },
  490. + { 0xe9003140, ~0x00800000, 0x00000000 },
  491. + { 0xe9003340, ~0x00800000, 0x00000000 },
  492. + { 0xe9001540, ~0x00800000, 0x00000000 },
  493. + { 0xe9001740, ~0x00800000, 0x00000000 },
  494. +};
  495. +
  496. +void program_hsio_sata_lpt_h_cx(const bool is_mobile)
  497. +{
  498. + const struct hsio_table_row *pch_hsio_table;
  499. + size_t len;
  500. +
  501. + pch_hsio_table = hsio_sata_lpt_h_cx;
  502. + len = ARRAY_SIZE(hsio_sata_lpt_h_cx);
  503. + for (size_t i = 0; i < len; i++)
  504. + hsio_update_row(pch_hsio_table[i]);
  505. +
  506. + pch_hsio_table = hsio_sata_shared_lpt_h_cx;
  507. + len = ARRAY_SIZE(hsio_sata_shared_lpt_h_cx);
  508. + for (size_t i = 0; i < len; i++)
  509. + hsio_sata_shared_update_row(pch_hsio_table[i]);
  510. +
  511. + const uint32_t hsio_sata_value = is_mobile ? 0x00004c5a : 0x00003e67;
  512. +
  513. + hsio_update(0xea002490, ~0x0000ffff, hsio_sata_value);
  514. + hsio_update(0xea002690, ~0x0000ffff, hsio_sata_value);
  515. + hsio_update(0xea000890, ~0x0000ffff, hsio_sata_value);
  516. + hsio_update(0xea000a90, ~0x0000ffff, hsio_sata_value);
  517. +
  518. + hsio_sata_shared_update(0xea002090, ~0x0000ffff, hsio_sata_value);
  519. + hsio_sata_shared_update(0xea002290, ~0x0000ffff, hsio_sata_value);
  520. +}
  521. +
  522. +void program_hsio_xhci_lpt_h_cx(void)
  523. +{
  524. + const struct hsio_table_row *pch_hsio_table;
  525. + size_t len;
  526. +
  527. + pch_hsio_table = hsio_xhci_lpt_h_cx;
  528. + len = ARRAY_SIZE(hsio_xhci_lpt_h_cx);
  529. +
  530. + for (size_t i = 0; i < len; i++)
  531. + hsio_update_row(pch_hsio_table[i]);
  532. +
  533. + pch_hsio_table = hsio_xhci_shared_lpt_h_cx;
  534. + len = ARRAY_SIZE(hsio_xhci_shared_lpt_h_cx);
  535. +
  536. + for (size_t i = 0; i < len; i++)
  537. + hsio_xhci_shared_update_row(pch_hsio_table[i]);
  538. +}
  539. +
  540. +void program_hsio_igbe_lpt_h_cx(void)
  541. +{
  542. + const uint32_t strpfusecfg1 = pci_read_config32(PCI_DEV(0, 0x1c, 0), 0xfc);
  543. + if (!(strpfusecfg1 & (1 << 19)))
  544. + return;
  545. +
  546. + const uint8_t gbe_port = (strpfusecfg1 >> 16) & 0x7;
  547. + const uint8_t lane_owner = pci_read_config8(PCI_DEV(0, 0x1c, 0), 0x410);
  548. + if (gbe_port == 0 && ((lane_owner >> 0) & 3) != 1)
  549. + return;
  550. +
  551. + if (gbe_port == 1 && ((lane_owner >> 2) & 3) != 1)
  552. + return;
  553. +
  554. + const uint32_t gbe_hsio_base = 0xe900 << 16 | (0x2e - 2 * gbe_port) << 8;
  555. + hsio_update(gbe_hsio_base + 0x08, ~0xf0000100, 0xe0000100);
  556. +}
  557. diff --git a/src/southbridge/intel/lynxpoint/hsio/lpt_lp_bx.c b/src/southbridge/intel/lynxpoint/hsio/lpt_lp_bx.c
  558. new file mode 100644
  559. index 0000000000..24679e791a
  560. --- /dev/null
  561. +++ b/src/southbridge/intel/lynxpoint/hsio/lpt_lp_bx.c
  562. @@ -0,0 +1,180 @@
  563. +/* SPDX-License-Identifier: GPL-2.0-or-later */
  564. +
  565. +#include <device/pci_ops.h>
  566. +#include <southbridge/intel/lynxpoint/iobp.h>
  567. +#include <southbridge/intel/lynxpoint/hsio/hsio.h>
  568. +#include <types.h>
  569. +
  570. +const struct hsio_table_row hsio_sata_shared_lpt_lp_bx[] = {
  571. + { 0xea008008, ~0xff000000, 0x1c000000 },
  572. + { 0xea002008, ~0xfffc6108, 0xea6c6108 },
  573. + { 0xea002208, ~0xfffc6108, 0xea6c6108 },
  574. + { 0xea002408, ~0xfffc6108, 0xea6c6108 },
  575. + { 0xea002608, ~0xfffc6108, 0xea6c6108 },
  576. + { 0xea002038, ~0x0000000f, 0x0000000d },
  577. + { 0xea002238, ~0x0000000f, 0x0000000d },
  578. + { 0xea002438, ~0x0000000f, 0x0000000d },
  579. + { 0xea002638, ~0x0000000f, 0x0000000d },
  580. + { 0xea00202c, ~0x00020f00, 0x00020100 },
  581. + { 0xea00222c, ~0x00020f00, 0x00020100 },
  582. + { 0xea00242c, ~0x00020f00, 0x00020100 },
  583. + { 0xea00262c, ~0x00020f00, 0x00020100 },
  584. + { 0xea002040, ~0x1f000000, 0x01000000 },
  585. + { 0xea002240, ~0x1f000000, 0x01000000 },
  586. + { 0xea002440, ~0x1f000000, 0x01000000 },
  587. + { 0xea002640, ~0x1f000000, 0x01000000 },
  588. + { 0xea002010, ~0xffff0000, 0x55510000 },
  589. + { 0xea002210, ~0xffff0000, 0x55510000 },
  590. + { 0xea002410, ~0xffff0000, 0x55510000 },
  591. + { 0xea002610, ~0xffff0000, 0x55510000 },
  592. + { 0xea002140, ~0x00ffffff, 0x00140718 },
  593. + { 0xea002340, ~0x00ffffff, 0x00140718 },
  594. + { 0xea002540, ~0x00ffffff, 0x00140718 },
  595. + { 0xea002740, ~0x00ffffff, 0x00140718 },
  596. + { 0xea002144, ~0x00ffffff, 0x00140998 },
  597. + { 0xea002344, ~0x00ffffff, 0x00140998 },
  598. + { 0xea002544, ~0x00ffffff, 0x00140998 },
  599. + { 0xea002744, ~0x00ffffff, 0x00140998 },
  600. + { 0xea002148, ~0x00ffffff, 0x00140998 },
  601. + { 0xea002348, ~0x00ffffff, 0x00140998 },
  602. + { 0xea002548, ~0x00ffffff, 0x00140998 },
  603. + { 0xea002748, ~0x00ffffff, 0x00140998 },
  604. + { 0xea00217c, ~0x03000000, 0x03000000 },
  605. + { 0xea00237c, ~0x03000000, 0x03000000 },
  606. + { 0xea00257c, ~0x03000000, 0x03000000 },
  607. + { 0xea00277c, ~0x03000000, 0x03000000 },
  608. + { 0xea00208c, ~0x00ff0000, 0x00800000 },
  609. + { 0xea00228c, ~0x00ff0000, 0x00800000 },
  610. + { 0xea00248c, ~0x00ff0000, 0x00800000 },
  611. + { 0xea00268c, ~0x00ff0000, 0x00800000 },
  612. + { 0xea0020a4, ~0x0030ff00, 0x00308300 },
  613. + { 0xea0022a4, ~0x0030ff00, 0x00308300 },
  614. + { 0xea0024a4, ~0x0030ff00, 0x00308300 },
  615. + { 0xea0026a4, ~0x0030ff00, 0x00308300 },
  616. + { 0xea0020ac, ~0x00000030, 0x00000020 },
  617. + { 0xea0022ac, ~0x00000030, 0x00000020 },
  618. + { 0xea0024ac, ~0x00000030, 0x00000020 },
  619. + { 0xea0026ac, ~0x00000030, 0x00000020 },
  620. + { 0xea002018, ~0xffff0300, 0x38250100 },
  621. + { 0xea002218, ~0xffff0300, 0x38250100 },
  622. + { 0xea002418, ~0xffff0300, 0x38250100 },
  623. + { 0xea002618, ~0xffff0300, 0x38250100 },
  624. + { 0xea002000, ~0xcf030000, 0xcf030000 },
  625. + { 0xea002200, ~0xcf030000, 0xcf030000 },
  626. + { 0xea002400, ~0xcf030000, 0xcf030000 },
  627. + { 0xea002600, ~0xcf030000, 0xcf030000 },
  628. + { 0xea002028, ~0xff1f0000, 0x580e0000 },
  629. + { 0xea002228, ~0xff1f0000, 0x580e0000 },
  630. + { 0xea002428, ~0xff1f0000, 0x580e0000 },
  631. + { 0xea002628, ~0xff1f0000, 0x580e0000 },
  632. + { 0xea00201c, ~0x00007c00, 0x00002400 },
  633. + { 0xea00221c, ~0x00007c00, 0x00002400 },
  634. + { 0xea00241c, ~0x00007c00, 0x00002400 },
  635. + { 0xea00261c, ~0x00007c00, 0x00002400 },
  636. + { 0xea002178, ~0x00001f00, 0x00001800 },
  637. + { 0xea002378, ~0x00001f00, 0x00001800 },
  638. + { 0xea002578, ~0x00001f00, 0x00001800 },
  639. + { 0xea002778, ~0x00001f00, 0x00001800 },
  640. + { 0xea00210c, ~0x0038000f, 0x00000005 },
  641. + { 0xea00230c, ~0x0038000f, 0x00000005 },
  642. + { 0xea00250c, ~0x0038000f, 0x00000005 },
  643. + { 0xea00270c, ~0x0038000f, 0x00000005 },
  644. +};
  645. +
  646. +const struct hsio_table_row hsio_xhci_shared_lpt_lp_bx[] = {
  647. + { 0xe90025cc, ~0x00001407, 0x00001407 },
  648. + { 0xe90027cc, ~0x00001407, 0x00001407 },
  649. + { 0xe9002568, ~0x01000f3c, 0x00000a28 },
  650. + { 0xe9002768, ~0x01000f3c, 0x00000a28 },
  651. + { 0xe900242c, ~0x00000700, 0x00000100 },
  652. + { 0xe900262c, ~0x00000700, 0x00000100 },
  653. + { 0xe900256c, ~0x000000ff, 0x0000003f },
  654. + { 0xe900276c, ~0x000000ff, 0x0000003f },
  655. + { 0xe900254c, ~0x00ffff00, 0x00120500 },
  656. + { 0xe900274c, ~0x00ffff00, 0x00120500 },
  657. + { 0xe9002564, ~0x0000f000, 0x00005000 },
  658. + { 0xe9002764, ~0x0000f000, 0x00005000 },
  659. + { 0xe9002570, ~0x00000018, 0x00000000 },
  660. + { 0xe9002770, ~0x00000018, 0x00000000 },
  661. + { 0xe9002514, ~0x38000700, 0x00000100 },
  662. + { 0xe9002714, ~0x38000700, 0x00000100 },
  663. + { 0xe9002438, ~0x0000000f, 0x0000000b },
  664. + { 0xe9002638, ~0x0000000f, 0x0000000b },
  665. + { 0xe9002414, ~0x0000fe00, 0x00006600 },
  666. + { 0xe9002614, ~0x0000fe00, 0x00006600 },
  667. + { 0xe9002540, ~0x00800000, 0x00000000 },
  668. + { 0xe9002740, ~0x00800000, 0x00000000 },
  669. +};
  670. +
  671. +const struct hsio_table_row hsio_xhci_lpt_lp_bx[] = {
  672. + { 0xe90021cc, ~0x00001407, 0x00001407 },
  673. + { 0xe90023cc, ~0x00001407, 0x00001407 },
  674. + { 0xe9002168, ~0x01000f3c, 0x00000a28 },
  675. + { 0xe9002368, ~0x01000f3c, 0x00000a28 },
  676. + { 0xe900216c, ~0x000000ff, 0x0000003f },
  677. + { 0xe900236c, ~0x000000ff, 0x0000003f },
  678. + { 0xe900214c, ~0x00ffff00, 0x00120500 },
  679. + { 0xe900234c, ~0x00ffff00, 0x00120500 },
  680. + { 0xe9002164, ~0x0000f000, 0x00005000 },
  681. + { 0xe9002364, ~0x0000f000, 0x00005000 },
  682. + { 0xe9002170, ~0x00000018, 0x00000000 },
  683. + { 0xe9002370, ~0x00000018, 0x00000000 },
  684. + { 0xe9002114, ~0x38000700, 0x00000100 },
  685. + { 0xe9002314, ~0x38000700, 0x00000100 },
  686. + { 0xe9002038, ~0x0000000f, 0x0000000b },
  687. + { 0xe9002238, ~0x0000000f, 0x0000000b },
  688. + { 0xe9002014, ~0x0000fe00, 0x00006600 },
  689. + { 0xe9002214, ~0x0000fe00, 0x00006600 },
  690. + { 0xe9002140, ~0x00800000, 0x00000000 },
  691. + { 0xe9002340, ~0x00800000, 0x00000000 },
  692. +};
  693. +
  694. +void program_hsio_sata_lpt_lp_bx(const bool is_mobile)
  695. +{
  696. + const struct hsio_table_row *pch_hsio_table;
  697. + size_t len;
  698. +
  699. + pch_hsio_table = hsio_sata_shared_lpt_lp_bx;
  700. + len = ARRAY_SIZE(hsio_sata_shared_lpt_lp_bx);
  701. + for (size_t i = 0; i < len; i++)
  702. + hsio_sata_shared_update_row(pch_hsio_table[i]);
  703. +
  704. + const uint32_t hsio_sata_value = is_mobile ? 0x00004c5a : 0x00003e67;
  705. +
  706. + hsio_sata_shared_update(0xea002090, ~0x0000ffff, hsio_sata_value);
  707. + hsio_sata_shared_update(0xea002290, ~0x0000ffff, hsio_sata_value);
  708. + hsio_sata_shared_update(0xea002490, ~0x0000ffff, hsio_sata_value);
  709. + hsio_sata_shared_update(0xea002690, ~0x0000ffff, hsio_sata_value);
  710. +}
  711. +
  712. +void program_hsio_xhci_lpt_lp_bx(void)
  713. +{
  714. + const struct hsio_table_row *pch_hsio_table;
  715. + size_t len;
  716. +
  717. + pch_hsio_table = hsio_xhci_lpt_lp_bx;
  718. + len = ARRAY_SIZE(hsio_xhci_lpt_lp_bx);
  719. +
  720. + for (size_t i = 0; i < len; i++)
  721. + hsio_update_row(pch_hsio_table[i]);
  722. +
  723. + pch_hsio_table = hsio_xhci_shared_lpt_lp_bx;
  724. + len = ARRAY_SIZE(hsio_xhci_shared_lpt_lp_bx);
  725. +
  726. + for (size_t i = 0; i < len; i++)
  727. + hsio_xhci_shared_update_row(pch_hsio_table[i]);
  728. +}
  729. +
  730. +void program_hsio_igbe_lpt_lp_bx(void)
  731. +{
  732. + const uint32_t strpfusecfg1 = pci_read_config32(PCI_DEV(0, 0x1c, 0), 0xfc);
  733. + if (!(strpfusecfg1 & (1 << 19)))
  734. + return;
  735. +
  736. + const uint8_t gbe_port = (strpfusecfg1 >> 16) & 0x7;
  737. + if (gbe_port > 5)
  738. + return;
  739. +
  740. + const uint32_t gbe_hsio_base = 0xe900 << 16 | (0x08 + 2 * gbe_port) << 8;
  741. + hsio_update(gbe_hsio_base + 0x08, ~0xf0000100, 0xe0000100);
  742. +}
  743. diff --git a/src/southbridge/intel/lynxpoint/pch.h b/src/southbridge/intel/lynxpoint/pch.h
  744. index 38a9349220..74b4d50017 100644
  745. --- a/src/southbridge/intel/lynxpoint/pch.h
  746. +++ b/src/southbridge/intel/lynxpoint/pch.h
  747. @@ -117,6 +117,7 @@ void pch_dmi_setup_physical_layer(void);
  748. void pch_dmi_tc_vc_mapping(u32 vc0, u32 vc1, u32 vcp, u32 vcm);
  749. void early_usb_init(void);
  750. void early_thermal_init(void);
  751. +void early_pch_init_native(int s3resume);
  752. void usb_ehci_sleep_prepare(pci_devfn_t dev, u8 slp_typ);
  753. void usb_ehci_disable(pci_devfn_t dev);
  754. @@ -271,6 +272,10 @@ void mainboard_config_rcba(void);
  755. #define IDE_DECODE_ENABLE (1 << 15)
  756. #define IDE_TIM_SEC 0x42 /* IDE timings, secondary */
  757. +#define SATA_MAP 0x90
  758. +#define SATA_PCS 0x92
  759. +#define SATA_SCLKG 0x94
  760. +
  761. #define SATA_SIRI 0xa0 /* SATA Indexed Register Index */
  762. #define SATA_SIRD 0xa4 /* SATA Indexed Register Data */
  763. #define SATA_SP 0xd0 /* Scratchpad */
  764. @@ -580,6 +585,7 @@ void mainboard_config_rcba(void);
  765. #define D19IR 0x3168 /* 16bit */
  766. #define ACPIIRQEN 0x31e0 /* 32bit */
  767. #define OIC 0x31fe /* 16bit */
  768. +#define PRSTS 0x3310 /* 32bit */
  769. #define PMSYNC_CONFIG 0x33c4 /* 32bit */
  770. #define PMSYNC_CONFIG2 0x33cc /* 32bit */
  771. #define SOFT_RESET_CTRL 0x38f4
  772. --
  773. 2.39.2