Subversion Repositories Kolibri OS

Rev

Rev 5078 | Rev 5271 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright 2011 Advanced Micro Devices, Inc.
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the "Software"),
  6.  * to deal in the Software without restriction, including without limitation
  7.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8.  * and/or sell copies of the Software, and to permit persons to whom the
  9.  * Software is furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice shall be included in
  12.  * all copies or substantial portions of the Software.
  13.  *
  14.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  17.  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18.  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20.  * OTHER DEALINGS IN THE SOFTWARE.
  21.  *
  22.  * Authors: Alex Deucher
  23.  */
  24. #include <linux/firmware.h>
  25. #include <linux/slab.h>
  26. #include <linux/module.h>
  27. #include <drm/drmP.h>
  28. #include "radeon.h"
  29. #include "radeon_asic.h"
  30. #include <drm/radeon_drm.h>
  31. #include "sid.h"
  32. #include "atom.h"
  33. #include "si_blit_shaders.h"
  34. #include "clearstate_si.h"
  35. #include "radeon_ucode.h"
  36.  
  37.  
  38. MODULE_FIRMWARE("radeon/TAHITI_pfp.bin");
  39. MODULE_FIRMWARE("radeon/TAHITI_me.bin");
  40. MODULE_FIRMWARE("radeon/TAHITI_ce.bin");
  41. MODULE_FIRMWARE("radeon/TAHITI_mc.bin");
  42. MODULE_FIRMWARE("radeon/TAHITI_mc2.bin");
  43. MODULE_FIRMWARE("radeon/TAHITI_rlc.bin");
  44. MODULE_FIRMWARE("radeon/TAHITI_smc.bin");
  45.  
  46. MODULE_FIRMWARE("radeon/tahiti_pfp.bin");
  47. MODULE_FIRMWARE("radeon/tahiti_me.bin");
  48. MODULE_FIRMWARE("radeon/tahiti_ce.bin");
  49. MODULE_FIRMWARE("radeon/tahiti_mc.bin");
  50. MODULE_FIRMWARE("radeon/tahiti_rlc.bin");
  51. MODULE_FIRMWARE("radeon/tahiti_smc.bin");
  52.  
  53. MODULE_FIRMWARE("radeon/PITCAIRN_pfp.bin");
  54. MODULE_FIRMWARE("radeon/PITCAIRN_me.bin");
  55. MODULE_FIRMWARE("radeon/PITCAIRN_ce.bin");
  56. MODULE_FIRMWARE("radeon/PITCAIRN_mc.bin");
  57. MODULE_FIRMWARE("radeon/PITCAIRN_mc2.bin");
  58. MODULE_FIRMWARE("radeon/PITCAIRN_rlc.bin");
  59. MODULE_FIRMWARE("radeon/PITCAIRN_smc.bin");
  60.  
  61. MODULE_FIRMWARE("radeon/pitcairn_pfp.bin");
  62. MODULE_FIRMWARE("radeon/pitcairn_me.bin");
  63. MODULE_FIRMWARE("radeon/pitcairn_ce.bin");
  64. MODULE_FIRMWARE("radeon/pitcairn_mc.bin");
  65. MODULE_FIRMWARE("radeon/pitcairn_rlc.bin");
  66. MODULE_FIRMWARE("radeon/pitcairn_smc.bin");
  67.  
  68. MODULE_FIRMWARE("radeon/VERDE_pfp.bin");
  69. MODULE_FIRMWARE("radeon/VERDE_me.bin");
  70. MODULE_FIRMWARE("radeon/VERDE_ce.bin");
  71. MODULE_FIRMWARE("radeon/VERDE_mc.bin");
  72. MODULE_FIRMWARE("radeon/VERDE_mc2.bin");
  73. MODULE_FIRMWARE("radeon/VERDE_rlc.bin");
  74. MODULE_FIRMWARE("radeon/VERDE_smc.bin");
  75.  
  76. MODULE_FIRMWARE("radeon/verde_pfp.bin");
  77. MODULE_FIRMWARE("radeon/verde_me.bin");
  78. MODULE_FIRMWARE("radeon/verde_ce.bin");
  79. MODULE_FIRMWARE("radeon/verde_mc.bin");
  80. MODULE_FIRMWARE("radeon/verde_rlc.bin");
  81. MODULE_FIRMWARE("radeon/verde_smc.bin");
  82.  
  83. MODULE_FIRMWARE("radeon/OLAND_pfp.bin");
  84. MODULE_FIRMWARE("radeon/OLAND_me.bin");
  85. MODULE_FIRMWARE("radeon/OLAND_ce.bin");
  86. MODULE_FIRMWARE("radeon/OLAND_mc.bin");
  87. MODULE_FIRMWARE("radeon/OLAND_mc2.bin");
  88. MODULE_FIRMWARE("radeon/OLAND_rlc.bin");
  89. MODULE_FIRMWARE("radeon/OLAND_smc.bin");
  90.  
  91. MODULE_FIRMWARE("radeon/oland_pfp.bin");
  92. MODULE_FIRMWARE("radeon/oland_me.bin");
  93. MODULE_FIRMWARE("radeon/oland_ce.bin");
  94. MODULE_FIRMWARE("radeon/oland_mc.bin");
  95. MODULE_FIRMWARE("radeon/oland_rlc.bin");
  96. MODULE_FIRMWARE("radeon/oland_smc.bin");
  97.  
  98. MODULE_FIRMWARE("radeon/HAINAN_pfp.bin");
  99. MODULE_FIRMWARE("radeon/HAINAN_me.bin");
  100. MODULE_FIRMWARE("radeon/HAINAN_ce.bin");
  101. MODULE_FIRMWARE("radeon/HAINAN_mc.bin");
  102. MODULE_FIRMWARE("radeon/HAINAN_mc2.bin");
  103. MODULE_FIRMWARE("radeon/HAINAN_rlc.bin");
  104. MODULE_FIRMWARE("radeon/HAINAN_smc.bin");
  105.  
  106. MODULE_FIRMWARE("radeon/hainan_pfp.bin");
  107. MODULE_FIRMWARE("radeon/hainan_me.bin");
  108. MODULE_FIRMWARE("radeon/hainan_ce.bin");
  109. MODULE_FIRMWARE("radeon/hainan_mc.bin");
  110. MODULE_FIRMWARE("radeon/hainan_rlc.bin");
  111. MODULE_FIRMWARE("radeon/hainan_smc.bin");
  112.  
  113. static u32 si_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh);
  114. static void si_pcie_gen3_enable(struct radeon_device *rdev);
  115. static void si_program_aspm(struct radeon_device *rdev);
  116. extern void sumo_rlc_fini(struct radeon_device *rdev);
  117. extern int sumo_rlc_init(struct radeon_device *rdev);
  118. extern int r600_ih_ring_alloc(struct radeon_device *rdev);
  119. extern void r600_ih_ring_fini(struct radeon_device *rdev);
  120. extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
  121. extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
  122. extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
  123. extern u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev);
  124. extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev);
  125. extern bool evergreen_is_display_hung(struct radeon_device *rdev);
  126. static void si_enable_gui_idle_interrupt(struct radeon_device *rdev,
  127.                                          bool enable);
  128. static void si_init_pg(struct radeon_device *rdev);
  129. static void si_init_cg(struct radeon_device *rdev);
  130. static void si_fini_pg(struct radeon_device *rdev);
  131. static void si_fini_cg(struct radeon_device *rdev);
  132. static void si_rlc_stop(struct radeon_device *rdev);
  133.  
  134. static const u32 verde_rlc_save_restore_register_list[] =
  135. {
  136.         (0x8000 << 16) | (0x98f4 >> 2),
  137.         0x00000000,
  138.         (0x8040 << 16) | (0x98f4 >> 2),
  139.         0x00000000,
  140.         (0x8000 << 16) | (0xe80 >> 2),
  141.         0x00000000,
  142.         (0x8040 << 16) | (0xe80 >> 2),
  143.         0x00000000,
  144.         (0x8000 << 16) | (0x89bc >> 2),
  145.         0x00000000,
  146.         (0x8040 << 16) | (0x89bc >> 2),
  147.         0x00000000,
  148.         (0x8000 << 16) | (0x8c1c >> 2),
  149.         0x00000000,
  150.         (0x8040 << 16) | (0x8c1c >> 2),
  151.         0x00000000,
  152.         (0x9c00 << 16) | (0x98f0 >> 2),
  153.         0x00000000,
  154.         (0x9c00 << 16) | (0xe7c >> 2),
  155.         0x00000000,
  156.         (0x8000 << 16) | (0x9148 >> 2),
  157.         0x00000000,
  158.         (0x8040 << 16) | (0x9148 >> 2),
  159.         0x00000000,
  160.         (0x9c00 << 16) | (0x9150 >> 2),
  161.         0x00000000,
  162.         (0x9c00 << 16) | (0x897c >> 2),
  163.         0x00000000,
  164.         (0x9c00 << 16) | (0x8d8c >> 2),
  165.         0x00000000,
  166.         (0x9c00 << 16) | (0xac54 >> 2),
  167.         0X00000000,
  168.         0x3,
  169.         (0x9c00 << 16) | (0x98f8 >> 2),
  170.         0x00000000,
  171.         (0x9c00 << 16) | (0x9910 >> 2),
  172.         0x00000000,
  173.         (0x9c00 << 16) | (0x9914 >> 2),
  174.         0x00000000,
  175.         (0x9c00 << 16) | (0x9918 >> 2),
  176.         0x00000000,
  177.         (0x9c00 << 16) | (0x991c >> 2),
  178.         0x00000000,
  179.         (0x9c00 << 16) | (0x9920 >> 2),
  180.         0x00000000,
  181.         (0x9c00 << 16) | (0x9924 >> 2),
  182.         0x00000000,
  183.         (0x9c00 << 16) | (0x9928 >> 2),
  184.         0x00000000,
  185.         (0x9c00 << 16) | (0x992c >> 2),
  186.         0x00000000,
  187.         (0x9c00 << 16) | (0x9930 >> 2),
  188.         0x00000000,
  189.         (0x9c00 << 16) | (0x9934 >> 2),
  190.         0x00000000,
  191.         (0x9c00 << 16) | (0x9938 >> 2),
  192.         0x00000000,
  193.         (0x9c00 << 16) | (0x993c >> 2),
  194.         0x00000000,
  195.         (0x9c00 << 16) | (0x9940 >> 2),
  196.         0x00000000,
  197.         (0x9c00 << 16) | (0x9944 >> 2),
  198.         0x00000000,
  199.         (0x9c00 << 16) | (0x9948 >> 2),
  200.         0x00000000,
  201.         (0x9c00 << 16) | (0x994c >> 2),
  202.         0x00000000,
  203.         (0x9c00 << 16) | (0x9950 >> 2),
  204.         0x00000000,
  205.         (0x9c00 << 16) | (0x9954 >> 2),
  206.         0x00000000,
  207.         (0x9c00 << 16) | (0x9958 >> 2),
  208.         0x00000000,
  209.         (0x9c00 << 16) | (0x995c >> 2),
  210.         0x00000000,
  211.         (0x9c00 << 16) | (0x9960 >> 2),
  212.         0x00000000,
  213.         (0x9c00 << 16) | (0x9964 >> 2),
  214.         0x00000000,
  215.         (0x9c00 << 16) | (0x9968 >> 2),
  216.         0x00000000,
  217.         (0x9c00 << 16) | (0x996c >> 2),
  218.         0x00000000,
  219.         (0x9c00 << 16) | (0x9970 >> 2),
  220.         0x00000000,
  221.         (0x9c00 << 16) | (0x9974 >> 2),
  222.         0x00000000,
  223.         (0x9c00 << 16) | (0x9978 >> 2),
  224.         0x00000000,
  225.         (0x9c00 << 16) | (0x997c >> 2),
  226.         0x00000000,
  227.         (0x9c00 << 16) | (0x9980 >> 2),
  228.         0x00000000,
  229.         (0x9c00 << 16) | (0x9984 >> 2),
  230.         0x00000000,
  231.         (0x9c00 << 16) | (0x9988 >> 2),
  232.         0x00000000,
  233.         (0x9c00 << 16) | (0x998c >> 2),
  234.         0x00000000,
  235.         (0x9c00 << 16) | (0x8c00 >> 2),
  236.         0x00000000,
  237.         (0x9c00 << 16) | (0x8c14 >> 2),
  238.         0x00000000,
  239.         (0x9c00 << 16) | (0x8c04 >> 2),
  240.         0x00000000,
  241.         (0x9c00 << 16) | (0x8c08 >> 2),
  242.         0x00000000,
  243.         (0x8000 << 16) | (0x9b7c >> 2),
  244.         0x00000000,
  245.         (0x8040 << 16) | (0x9b7c >> 2),
  246.         0x00000000,
  247.         (0x8000 << 16) | (0xe84 >> 2),
  248.         0x00000000,
  249.         (0x8040 << 16) | (0xe84 >> 2),
  250.         0x00000000,
  251.         (0x8000 << 16) | (0x89c0 >> 2),
  252.         0x00000000,
  253.         (0x8040 << 16) | (0x89c0 >> 2),
  254.         0x00000000,
  255.         (0x8000 << 16) | (0x914c >> 2),
  256.         0x00000000,
  257.         (0x8040 << 16) | (0x914c >> 2),
  258.         0x00000000,
  259.         (0x8000 << 16) | (0x8c20 >> 2),
  260.         0x00000000,
  261.         (0x8040 << 16) | (0x8c20 >> 2),
  262.         0x00000000,
  263.         (0x8000 << 16) | (0x9354 >> 2),
  264.         0x00000000,
  265.         (0x8040 << 16) | (0x9354 >> 2),
  266.         0x00000000,
  267.         (0x9c00 << 16) | (0x9060 >> 2),
  268.         0x00000000,
  269.         (0x9c00 << 16) | (0x9364 >> 2),
  270.         0x00000000,
  271.         (0x9c00 << 16) | (0x9100 >> 2),
  272.         0x00000000,
  273.         (0x9c00 << 16) | (0x913c >> 2),
  274.         0x00000000,
  275.         (0x8000 << 16) | (0x90e0 >> 2),
  276.         0x00000000,
  277.         (0x8000 << 16) | (0x90e4 >> 2),
  278.         0x00000000,
  279.         (0x8000 << 16) | (0x90e8 >> 2),
  280.         0x00000000,
  281.         (0x8040 << 16) | (0x90e0 >> 2),
  282.         0x00000000,
  283.         (0x8040 << 16) | (0x90e4 >> 2),
  284.         0x00000000,
  285.         (0x8040 << 16) | (0x90e8 >> 2),
  286.         0x00000000,
  287.         (0x9c00 << 16) | (0x8bcc >> 2),
  288.         0x00000000,
  289.         (0x9c00 << 16) | (0x8b24 >> 2),
  290.         0x00000000,
  291.         (0x9c00 << 16) | (0x88c4 >> 2),
  292.         0x00000000,
  293.         (0x9c00 << 16) | (0x8e50 >> 2),
  294.         0x00000000,
  295.         (0x9c00 << 16) | (0x8c0c >> 2),
  296.         0x00000000,
  297.         (0x9c00 << 16) | (0x8e58 >> 2),
  298.         0x00000000,
  299.         (0x9c00 << 16) | (0x8e5c >> 2),
  300.         0x00000000,
  301.         (0x9c00 << 16) | (0x9508 >> 2),
  302.         0x00000000,
  303.         (0x9c00 << 16) | (0x950c >> 2),
  304.         0x00000000,
  305.         (0x9c00 << 16) | (0x9494 >> 2),
  306.         0x00000000,
  307.         (0x9c00 << 16) | (0xac0c >> 2),
  308.         0x00000000,
  309.         (0x9c00 << 16) | (0xac10 >> 2),
  310.         0x00000000,
  311.         (0x9c00 << 16) | (0xac14 >> 2),
  312.         0x00000000,
  313.         (0x9c00 << 16) | (0xae00 >> 2),
  314.         0x00000000,
  315.         (0x9c00 << 16) | (0xac08 >> 2),
  316.         0x00000000,
  317.         (0x9c00 << 16) | (0x88d4 >> 2),
  318.         0x00000000,
  319.         (0x9c00 << 16) | (0x88c8 >> 2),
  320.         0x00000000,
  321.         (0x9c00 << 16) | (0x88cc >> 2),
  322.         0x00000000,
  323.         (0x9c00 << 16) | (0x89b0 >> 2),
  324.         0x00000000,
  325.         (0x9c00 << 16) | (0x8b10 >> 2),
  326.         0x00000000,
  327.         (0x9c00 << 16) | (0x8a14 >> 2),
  328.         0x00000000,
  329.         (0x9c00 << 16) | (0x9830 >> 2),
  330.         0x00000000,
  331.         (0x9c00 << 16) | (0x9834 >> 2),
  332.         0x00000000,
  333.         (0x9c00 << 16) | (0x9838 >> 2),
  334.         0x00000000,
  335.         (0x9c00 << 16) | (0x9a10 >> 2),
  336.         0x00000000,
  337.         (0x8000 << 16) | (0x9870 >> 2),
  338.         0x00000000,
  339.         (0x8000 << 16) | (0x9874 >> 2),
  340.         0x00000000,
  341.         (0x8001 << 16) | (0x9870 >> 2),
  342.         0x00000000,
  343.         (0x8001 << 16) | (0x9874 >> 2),
  344.         0x00000000,
  345.         (0x8040 << 16) | (0x9870 >> 2),
  346.         0x00000000,
  347.         (0x8040 << 16) | (0x9874 >> 2),
  348.         0x00000000,
  349.         (0x8041 << 16) | (0x9870 >> 2),
  350.         0x00000000,
  351.         (0x8041 << 16) | (0x9874 >> 2),
  352.         0x00000000,
  353.         0x00000000
  354. };
  355.  
  356. static const u32 tahiti_golden_rlc_registers[] =
  357. {
  358.         0xc424, 0xffffffff, 0x00601005,
  359.         0xc47c, 0xffffffff, 0x10104040,
  360.         0xc488, 0xffffffff, 0x0100000a,
  361.         0xc314, 0xffffffff, 0x00000800,
  362.         0xc30c, 0xffffffff, 0x800000f4,
  363.         0xf4a8, 0xffffffff, 0x00000000
  364. };
  365.  
  366. static const u32 tahiti_golden_registers[] =
  367. {
  368.         0x9a10, 0x00010000, 0x00018208,
  369.         0x9830, 0xffffffff, 0x00000000,
  370.         0x9834, 0xf00fffff, 0x00000400,
  371.         0x9838, 0x0002021c, 0x00020200,
  372.         0xc78, 0x00000080, 0x00000000,
  373.         0xd030, 0x000300c0, 0x00800040,
  374.         0xd830, 0x000300c0, 0x00800040,
  375.         0x5bb0, 0x000000f0, 0x00000070,
  376.         0x5bc0, 0x00200000, 0x50100000,
  377.         0x7030, 0x31000311, 0x00000011,
  378.         0x277c, 0x00000003, 0x000007ff,
  379.         0x240c, 0x000007ff, 0x00000000,
  380.         0x8a14, 0xf000001f, 0x00000007,
  381.         0x8b24, 0xffffffff, 0x00ffffff,
  382.         0x8b10, 0x0000ff0f, 0x00000000,
  383.         0x28a4c, 0x07ffffff, 0x4e000000,
  384.         0x28350, 0x3f3f3fff, 0x2a00126a,
  385.         0x30, 0x000000ff, 0x0040,
  386.         0x34, 0x00000040, 0x00004040,
  387.         0x9100, 0x07ffffff, 0x03000000,
  388.         0x8e88, 0x01ff1f3f, 0x00000000,
  389.         0x8e84, 0x01ff1f3f, 0x00000000,
  390.         0x9060, 0x0000007f, 0x00000020,
  391.         0x9508, 0x00010000, 0x00010000,
  392.         0xac14, 0x00000200, 0x000002fb,
  393.         0xac10, 0xffffffff, 0x0000543b,
  394.         0xac0c, 0xffffffff, 0xa9210876,
  395.         0x88d0, 0xffffffff, 0x000fff40,
  396.         0x88d4, 0x0000001f, 0x00000010,
  397.         0x1410, 0x20000000, 0x20fffed8,
  398.         0x15c0, 0x000c0fc0, 0x000c0400
  399. };
  400.  
  401. static const u32 tahiti_golden_registers2[] =
  402. {
  403.         0xc64, 0x00000001, 0x00000001
  404. };
  405.  
  406. static const u32 pitcairn_golden_rlc_registers[] =
  407. {
  408.         0xc424, 0xffffffff, 0x00601004,
  409.         0xc47c, 0xffffffff, 0x10102020,
  410.         0xc488, 0xffffffff, 0x01000020,
  411.         0xc314, 0xffffffff, 0x00000800,
  412.         0xc30c, 0xffffffff, 0x800000a4
  413. };
  414.  
  415. static const u32 pitcairn_golden_registers[] =
  416. {
  417.         0x9a10, 0x00010000, 0x00018208,
  418.         0x9830, 0xffffffff, 0x00000000,
  419.         0x9834, 0xf00fffff, 0x00000400,
  420.         0x9838, 0x0002021c, 0x00020200,
  421.         0xc78, 0x00000080, 0x00000000,
  422.         0xd030, 0x000300c0, 0x00800040,
  423.         0xd830, 0x000300c0, 0x00800040,
  424.         0x5bb0, 0x000000f0, 0x00000070,
  425.         0x5bc0, 0x00200000, 0x50100000,
  426.         0x7030, 0x31000311, 0x00000011,
  427.         0x2ae4, 0x00073ffe, 0x000022a2,
  428.         0x240c, 0x000007ff, 0x00000000,
  429.         0x8a14, 0xf000001f, 0x00000007,
  430.         0x8b24, 0xffffffff, 0x00ffffff,
  431.         0x8b10, 0x0000ff0f, 0x00000000,
  432.         0x28a4c, 0x07ffffff, 0x4e000000,
  433.         0x28350, 0x3f3f3fff, 0x2a00126a,
  434.         0x30, 0x000000ff, 0x0040,
  435.         0x34, 0x00000040, 0x00004040,
  436.         0x9100, 0x07ffffff, 0x03000000,
  437.         0x9060, 0x0000007f, 0x00000020,
  438.         0x9508, 0x00010000, 0x00010000,
  439.         0xac14, 0x000003ff, 0x000000f7,
  440.         0xac10, 0xffffffff, 0x00000000,
  441.         0xac0c, 0xffffffff, 0x32761054,
  442.         0x88d4, 0x0000001f, 0x00000010,
  443.         0x15c0, 0x000c0fc0, 0x000c0400
  444. };
  445.  
  446. static const u32 verde_golden_rlc_registers[] =
  447. {
  448.         0xc424, 0xffffffff, 0x033f1005,
  449.         0xc47c, 0xffffffff, 0x10808020,
  450.         0xc488, 0xffffffff, 0x00800008,
  451.         0xc314, 0xffffffff, 0x00001000,
  452.         0xc30c, 0xffffffff, 0x80010014
  453. };
  454.  
  455. static const u32 verde_golden_registers[] =
  456. {
  457.         0x9a10, 0x00010000, 0x00018208,
  458.         0x9830, 0xffffffff, 0x00000000,
  459.         0x9834, 0xf00fffff, 0x00000400,
  460.         0x9838, 0x0002021c, 0x00020200,
  461.         0xc78, 0x00000080, 0x00000000,
  462.         0xd030, 0x000300c0, 0x00800040,
  463.         0xd030, 0x000300c0, 0x00800040,
  464.         0xd830, 0x000300c0, 0x00800040,
  465.         0xd830, 0x000300c0, 0x00800040,
  466.         0x5bb0, 0x000000f0, 0x00000070,
  467.         0x5bc0, 0x00200000, 0x50100000,
  468.         0x7030, 0x31000311, 0x00000011,
  469.         0x2ae4, 0x00073ffe, 0x000022a2,
  470.         0x2ae4, 0x00073ffe, 0x000022a2,
  471.         0x2ae4, 0x00073ffe, 0x000022a2,
  472.         0x240c, 0x000007ff, 0x00000000,
  473.         0x240c, 0x000007ff, 0x00000000,
  474.         0x240c, 0x000007ff, 0x00000000,
  475.         0x8a14, 0xf000001f, 0x00000007,
  476.         0x8a14, 0xf000001f, 0x00000007,
  477.         0x8a14, 0xf000001f, 0x00000007,
  478.         0x8b24, 0xffffffff, 0x00ffffff,
  479.         0x8b10, 0x0000ff0f, 0x00000000,
  480.         0x28a4c, 0x07ffffff, 0x4e000000,
  481.         0x28350, 0x3f3f3fff, 0x0000124a,
  482.         0x28350, 0x3f3f3fff, 0x0000124a,
  483.         0x28350, 0x3f3f3fff, 0x0000124a,
  484.         0x30, 0x000000ff, 0x0040,
  485.         0x34, 0x00000040, 0x00004040,
  486.         0x9100, 0x07ffffff, 0x03000000,
  487.         0x9100, 0x07ffffff, 0x03000000,
  488.         0x8e88, 0x01ff1f3f, 0x00000000,
  489.         0x8e88, 0x01ff1f3f, 0x00000000,
  490.         0x8e88, 0x01ff1f3f, 0x00000000,
  491.         0x8e84, 0x01ff1f3f, 0x00000000,
  492.         0x8e84, 0x01ff1f3f, 0x00000000,
  493.         0x8e84, 0x01ff1f3f, 0x00000000,
  494.         0x9060, 0x0000007f, 0x00000020,
  495.         0x9508, 0x00010000, 0x00010000,
  496.         0xac14, 0x000003ff, 0x00000003,
  497.         0xac14, 0x000003ff, 0x00000003,
  498.         0xac14, 0x000003ff, 0x00000003,
  499.         0xac10, 0xffffffff, 0x00000000,
  500.         0xac10, 0xffffffff, 0x00000000,
  501.         0xac10, 0xffffffff, 0x00000000,
  502.         0xac0c, 0xffffffff, 0x00001032,
  503.         0xac0c, 0xffffffff, 0x00001032,
  504.         0xac0c, 0xffffffff, 0x00001032,
  505.         0x88d4, 0x0000001f, 0x00000010,
  506.         0x88d4, 0x0000001f, 0x00000010,
  507.         0x88d4, 0x0000001f, 0x00000010,
  508.         0x15c0, 0x000c0fc0, 0x000c0400
  509. };
  510.  
  511. static const u32 oland_golden_rlc_registers[] =
  512. {
  513.         0xc424, 0xffffffff, 0x00601005,
  514.         0xc47c, 0xffffffff, 0x10104040,
  515.         0xc488, 0xffffffff, 0x0100000a,
  516.         0xc314, 0xffffffff, 0x00000800,
  517.         0xc30c, 0xffffffff, 0x800000f4
  518. };
  519.  
  520. static const u32 oland_golden_registers[] =
  521. {
  522.         0x9a10, 0x00010000, 0x00018208,
  523.         0x9830, 0xffffffff, 0x00000000,
  524.         0x9834, 0xf00fffff, 0x00000400,
  525.         0x9838, 0x0002021c, 0x00020200,
  526.         0xc78, 0x00000080, 0x00000000,
  527.         0xd030, 0x000300c0, 0x00800040,
  528.         0xd830, 0x000300c0, 0x00800040,
  529.         0x5bb0, 0x000000f0, 0x00000070,
  530.         0x5bc0, 0x00200000, 0x50100000,
  531.         0x7030, 0x31000311, 0x00000011,
  532.         0x2ae4, 0x00073ffe, 0x000022a2,
  533.         0x240c, 0x000007ff, 0x00000000,
  534.         0x8a14, 0xf000001f, 0x00000007,
  535.         0x8b24, 0xffffffff, 0x00ffffff,
  536.         0x8b10, 0x0000ff0f, 0x00000000,
  537.         0x28a4c, 0x07ffffff, 0x4e000000,
  538.         0x28350, 0x3f3f3fff, 0x00000082,
  539.         0x30, 0x000000ff, 0x0040,
  540.         0x34, 0x00000040, 0x00004040,
  541.         0x9100, 0x07ffffff, 0x03000000,
  542.         0x9060, 0x0000007f, 0x00000020,
  543.         0x9508, 0x00010000, 0x00010000,
  544.         0xac14, 0x000003ff, 0x000000f3,
  545.         0xac10, 0xffffffff, 0x00000000,
  546.         0xac0c, 0xffffffff, 0x00003210,
  547.         0x88d4, 0x0000001f, 0x00000010,
  548.         0x15c0, 0x000c0fc0, 0x000c0400
  549. };
  550.  
  551. static const u32 hainan_golden_registers[] =
  552. {
  553.         0x9a10, 0x00010000, 0x00018208,
  554.         0x9830, 0xffffffff, 0x00000000,
  555.         0x9834, 0xf00fffff, 0x00000400,
  556.         0x9838, 0x0002021c, 0x00020200,
  557.         0xd0c0, 0xff000fff, 0x00000100,
  558.         0xd030, 0x000300c0, 0x00800040,
  559.         0xd8c0, 0xff000fff, 0x00000100,
  560.         0xd830, 0x000300c0, 0x00800040,
  561.         0x2ae4, 0x00073ffe, 0x000022a2,
  562.         0x240c, 0x000007ff, 0x00000000,
  563.         0x8a14, 0xf000001f, 0x00000007,
  564.         0x8b24, 0xffffffff, 0x00ffffff,
  565.         0x8b10, 0x0000ff0f, 0x00000000,
  566.         0x28a4c, 0x07ffffff, 0x4e000000,
  567.         0x28350, 0x3f3f3fff, 0x00000000,
  568.         0x30, 0x000000ff, 0x0040,
  569.         0x34, 0x00000040, 0x00004040,
  570.         0x9100, 0x03e00000, 0x03600000,
  571.         0x9060, 0x0000007f, 0x00000020,
  572.         0x9508, 0x00010000, 0x00010000,
  573.         0xac14, 0x000003ff, 0x000000f1,
  574.         0xac10, 0xffffffff, 0x00000000,
  575.         0xac0c, 0xffffffff, 0x00003210,
  576.         0x88d4, 0x0000001f, 0x00000010,
  577.         0x15c0, 0x000c0fc0, 0x000c0400
  578. };
  579.  
  580. static const u32 hainan_golden_registers2[] =
  581. {
  582.         0x98f8, 0xffffffff, 0x02010001
  583. };
  584.  
  585. static const u32 tahiti_mgcg_cgcg_init[] =
  586. {
  587.         0xc400, 0xffffffff, 0xfffffffc,
  588.         0x802c, 0xffffffff, 0xe0000000,
  589.         0x9a60, 0xffffffff, 0x00000100,
  590.         0x92a4, 0xffffffff, 0x00000100,
  591.         0xc164, 0xffffffff, 0x00000100,
  592.         0x9774, 0xffffffff, 0x00000100,
  593.         0x8984, 0xffffffff, 0x06000100,
  594.         0x8a18, 0xffffffff, 0x00000100,
  595.         0x92a0, 0xffffffff, 0x00000100,
  596.         0xc380, 0xffffffff, 0x00000100,
  597.         0x8b28, 0xffffffff, 0x00000100,
  598.         0x9144, 0xffffffff, 0x00000100,
  599.         0x8d88, 0xffffffff, 0x00000100,
  600.         0x8d8c, 0xffffffff, 0x00000100,
  601.         0x9030, 0xffffffff, 0x00000100,
  602.         0x9034, 0xffffffff, 0x00000100,
  603.         0x9038, 0xffffffff, 0x00000100,
  604.         0x903c, 0xffffffff, 0x00000100,
  605.         0xad80, 0xffffffff, 0x00000100,
  606.         0xac54, 0xffffffff, 0x00000100,
  607.         0x897c, 0xffffffff, 0x06000100,
  608.         0x9868, 0xffffffff, 0x00000100,
  609.         0x9510, 0xffffffff, 0x00000100,
  610.         0xaf04, 0xffffffff, 0x00000100,
  611.         0xae04, 0xffffffff, 0x00000100,
  612.         0x949c, 0xffffffff, 0x00000100,
  613.         0x802c, 0xffffffff, 0xe0000000,
  614.         0x9160, 0xffffffff, 0x00010000,
  615.         0x9164, 0xffffffff, 0x00030002,
  616.         0x9168, 0xffffffff, 0x00040007,
  617.         0x916c, 0xffffffff, 0x00060005,
  618.         0x9170, 0xffffffff, 0x00090008,
  619.         0x9174, 0xffffffff, 0x00020001,
  620.         0x9178, 0xffffffff, 0x00040003,
  621.         0x917c, 0xffffffff, 0x00000007,
  622.         0x9180, 0xffffffff, 0x00060005,
  623.         0x9184, 0xffffffff, 0x00090008,
  624.         0x9188, 0xffffffff, 0x00030002,
  625.         0x918c, 0xffffffff, 0x00050004,
  626.         0x9190, 0xffffffff, 0x00000008,
  627.         0x9194, 0xffffffff, 0x00070006,
  628.         0x9198, 0xffffffff, 0x000a0009,
  629.         0x919c, 0xffffffff, 0x00040003,
  630.         0x91a0, 0xffffffff, 0x00060005,
  631.         0x91a4, 0xffffffff, 0x00000009,
  632.         0x91a8, 0xffffffff, 0x00080007,
  633.         0x91ac, 0xffffffff, 0x000b000a,
  634.         0x91b0, 0xffffffff, 0x00050004,
  635.         0x91b4, 0xffffffff, 0x00070006,
  636.         0x91b8, 0xffffffff, 0x0008000b,
  637.         0x91bc, 0xffffffff, 0x000a0009,
  638.         0x91c0, 0xffffffff, 0x000d000c,
  639.         0x91c4, 0xffffffff, 0x00060005,
  640.         0x91c8, 0xffffffff, 0x00080007,
  641.         0x91cc, 0xffffffff, 0x0000000b,
  642.         0x91d0, 0xffffffff, 0x000a0009,
  643.         0x91d4, 0xffffffff, 0x000d000c,
  644.         0x91d8, 0xffffffff, 0x00070006,
  645.         0x91dc, 0xffffffff, 0x00090008,
  646.         0x91e0, 0xffffffff, 0x0000000c,
  647.         0x91e4, 0xffffffff, 0x000b000a,
  648.         0x91e8, 0xffffffff, 0x000e000d,
  649.         0x91ec, 0xffffffff, 0x00080007,
  650.         0x91f0, 0xffffffff, 0x000a0009,
  651.         0x91f4, 0xffffffff, 0x0000000d,
  652.         0x91f8, 0xffffffff, 0x000c000b,
  653.         0x91fc, 0xffffffff, 0x000f000e,
  654.         0x9200, 0xffffffff, 0x00090008,
  655.         0x9204, 0xffffffff, 0x000b000a,
  656.         0x9208, 0xffffffff, 0x000c000f,
  657.         0x920c, 0xffffffff, 0x000e000d,
  658.         0x9210, 0xffffffff, 0x00110010,
  659.         0x9214, 0xffffffff, 0x000a0009,
  660.         0x9218, 0xffffffff, 0x000c000b,
  661.         0x921c, 0xffffffff, 0x0000000f,
  662.         0x9220, 0xffffffff, 0x000e000d,
  663.         0x9224, 0xffffffff, 0x00110010,
  664.         0x9228, 0xffffffff, 0x000b000a,
  665.         0x922c, 0xffffffff, 0x000d000c,
  666.         0x9230, 0xffffffff, 0x00000010,
  667.         0x9234, 0xffffffff, 0x000f000e,
  668.         0x9238, 0xffffffff, 0x00120011,
  669.         0x923c, 0xffffffff, 0x000c000b,
  670.         0x9240, 0xffffffff, 0x000e000d,
  671.         0x9244, 0xffffffff, 0x00000011,
  672.         0x9248, 0xffffffff, 0x0010000f,
  673.         0x924c, 0xffffffff, 0x00130012,
  674.         0x9250, 0xffffffff, 0x000d000c,
  675.         0x9254, 0xffffffff, 0x000f000e,
  676.         0x9258, 0xffffffff, 0x00100013,
  677.         0x925c, 0xffffffff, 0x00120011,
  678.         0x9260, 0xffffffff, 0x00150014,
  679.         0x9264, 0xffffffff, 0x000e000d,
  680.         0x9268, 0xffffffff, 0x0010000f,
  681.         0x926c, 0xffffffff, 0x00000013,
  682.         0x9270, 0xffffffff, 0x00120011,
  683.         0x9274, 0xffffffff, 0x00150014,
  684.         0x9278, 0xffffffff, 0x000f000e,
  685.         0x927c, 0xffffffff, 0x00110010,
  686.         0x9280, 0xffffffff, 0x00000014,
  687.         0x9284, 0xffffffff, 0x00130012,
  688.         0x9288, 0xffffffff, 0x00160015,
  689.         0x928c, 0xffffffff, 0x0010000f,
  690.         0x9290, 0xffffffff, 0x00120011,
  691.         0x9294, 0xffffffff, 0x00000015,
  692.         0x9298, 0xffffffff, 0x00140013,
  693.         0x929c, 0xffffffff, 0x00170016,
  694.         0x9150, 0xffffffff, 0x96940200,
  695.         0x8708, 0xffffffff, 0x00900100,
  696.         0xc478, 0xffffffff, 0x00000080,
  697.         0xc404, 0xffffffff, 0x0020003f,
  698.         0x30, 0xffffffff, 0x0000001c,
  699.         0x34, 0x000f0000, 0x000f0000,
  700.         0x160c, 0xffffffff, 0x00000100,
  701.         0x1024, 0xffffffff, 0x00000100,
  702.         0x102c, 0x00000101, 0x00000000,
  703.         0x20a8, 0xffffffff, 0x00000104,
  704.         0x264c, 0x000c0000, 0x000c0000,
  705.         0x2648, 0x000c0000, 0x000c0000,
  706.         0x55e4, 0xff000fff, 0x00000100,
  707.         0x55e8, 0x00000001, 0x00000001,
  708.         0x2f50, 0x00000001, 0x00000001,
  709.         0x30cc, 0xc0000fff, 0x00000104,
  710.         0xc1e4, 0x00000001, 0x00000001,
  711.         0xd0c0, 0xfffffff0, 0x00000100,
  712.         0xd8c0, 0xfffffff0, 0x00000100
  713. };
  714.  
  715. static const u32 pitcairn_mgcg_cgcg_init[] =
  716. {
  717.         0xc400, 0xffffffff, 0xfffffffc,
  718.         0x802c, 0xffffffff, 0xe0000000,
  719.         0x9a60, 0xffffffff, 0x00000100,
  720.         0x92a4, 0xffffffff, 0x00000100,
  721.         0xc164, 0xffffffff, 0x00000100,
  722.         0x9774, 0xffffffff, 0x00000100,
  723.         0x8984, 0xffffffff, 0x06000100,
  724.         0x8a18, 0xffffffff, 0x00000100,
  725.         0x92a0, 0xffffffff, 0x00000100,
  726.         0xc380, 0xffffffff, 0x00000100,
  727.         0x8b28, 0xffffffff, 0x00000100,
  728.         0x9144, 0xffffffff, 0x00000100,
  729.         0x8d88, 0xffffffff, 0x00000100,
  730.         0x8d8c, 0xffffffff, 0x00000100,
  731.         0x9030, 0xffffffff, 0x00000100,
  732.         0x9034, 0xffffffff, 0x00000100,
  733.         0x9038, 0xffffffff, 0x00000100,
  734.         0x903c, 0xffffffff, 0x00000100,
  735.         0xad80, 0xffffffff, 0x00000100,
  736.         0xac54, 0xffffffff, 0x00000100,
  737.         0x897c, 0xffffffff, 0x06000100,
  738.         0x9868, 0xffffffff, 0x00000100,
  739.         0x9510, 0xffffffff, 0x00000100,
  740.         0xaf04, 0xffffffff, 0x00000100,
  741.         0xae04, 0xffffffff, 0x00000100,
  742.         0x949c, 0xffffffff, 0x00000100,
  743.         0x802c, 0xffffffff, 0xe0000000,
  744.         0x9160, 0xffffffff, 0x00010000,
  745.         0x9164, 0xffffffff, 0x00030002,
  746.         0x9168, 0xffffffff, 0x00040007,
  747.         0x916c, 0xffffffff, 0x00060005,
  748.         0x9170, 0xffffffff, 0x00090008,
  749.         0x9174, 0xffffffff, 0x00020001,
  750.         0x9178, 0xffffffff, 0x00040003,
  751.         0x917c, 0xffffffff, 0x00000007,
  752.         0x9180, 0xffffffff, 0x00060005,
  753.         0x9184, 0xffffffff, 0x00090008,
  754.         0x9188, 0xffffffff, 0x00030002,
  755.         0x918c, 0xffffffff, 0x00050004,
  756.         0x9190, 0xffffffff, 0x00000008,
  757.         0x9194, 0xffffffff, 0x00070006,
  758.         0x9198, 0xffffffff, 0x000a0009,
  759.         0x919c, 0xffffffff, 0x00040003,
  760.         0x91a0, 0xffffffff, 0x00060005,
  761.         0x91a4, 0xffffffff, 0x00000009,
  762.         0x91a8, 0xffffffff, 0x00080007,
  763.         0x91ac, 0xffffffff, 0x000b000a,
  764.         0x91b0, 0xffffffff, 0x00050004,
  765.         0x91b4, 0xffffffff, 0x00070006,
  766.         0x91b8, 0xffffffff, 0x0008000b,
  767.         0x91bc, 0xffffffff, 0x000a0009,
  768.         0x91c0, 0xffffffff, 0x000d000c,
  769.         0x9200, 0xffffffff, 0x00090008,
  770.         0x9204, 0xffffffff, 0x000b000a,
  771.         0x9208, 0xffffffff, 0x000c000f,
  772.         0x920c, 0xffffffff, 0x000e000d,
  773.         0x9210, 0xffffffff, 0x00110010,
  774.         0x9214, 0xffffffff, 0x000a0009,
  775.         0x9218, 0xffffffff, 0x000c000b,
  776.         0x921c, 0xffffffff, 0x0000000f,
  777.         0x9220, 0xffffffff, 0x000e000d,
  778.         0x9224, 0xffffffff, 0x00110010,
  779.         0x9228, 0xffffffff, 0x000b000a,
  780.         0x922c, 0xffffffff, 0x000d000c,
  781.         0x9230, 0xffffffff, 0x00000010,
  782.         0x9234, 0xffffffff, 0x000f000e,
  783.         0x9238, 0xffffffff, 0x00120011,
  784.         0x923c, 0xffffffff, 0x000c000b,
  785.         0x9240, 0xffffffff, 0x000e000d,
  786.         0x9244, 0xffffffff, 0x00000011,
  787.         0x9248, 0xffffffff, 0x0010000f,
  788.         0x924c, 0xffffffff, 0x00130012,
  789.         0x9250, 0xffffffff, 0x000d000c,
  790.         0x9254, 0xffffffff, 0x000f000e,
  791.         0x9258, 0xffffffff, 0x00100013,
  792.         0x925c, 0xffffffff, 0x00120011,
  793.         0x9260, 0xffffffff, 0x00150014,
  794.         0x9150, 0xffffffff, 0x96940200,
  795.         0x8708, 0xffffffff, 0x00900100,
  796.         0xc478, 0xffffffff, 0x00000080,
  797.         0xc404, 0xffffffff, 0x0020003f,
  798.         0x30, 0xffffffff, 0x0000001c,
  799.         0x34, 0x000f0000, 0x000f0000,
  800.         0x160c, 0xffffffff, 0x00000100,
  801.         0x1024, 0xffffffff, 0x00000100,
  802.         0x102c, 0x00000101, 0x00000000,
  803.         0x20a8, 0xffffffff, 0x00000104,
  804.         0x55e4, 0xff000fff, 0x00000100,
  805.         0x55e8, 0x00000001, 0x00000001,
  806.         0x2f50, 0x00000001, 0x00000001,
  807.         0x30cc, 0xc0000fff, 0x00000104,
  808.         0xc1e4, 0x00000001, 0x00000001,
  809.         0xd0c0, 0xfffffff0, 0x00000100,
  810.         0xd8c0, 0xfffffff0, 0x00000100
  811. };
  812.  
  813. static const u32 verde_mgcg_cgcg_init[] =
  814. {
  815.         0xc400, 0xffffffff, 0xfffffffc,
  816.         0x802c, 0xffffffff, 0xe0000000,
  817.         0x9a60, 0xffffffff, 0x00000100,
  818.         0x92a4, 0xffffffff, 0x00000100,
  819.         0xc164, 0xffffffff, 0x00000100,
  820.         0x9774, 0xffffffff, 0x00000100,
  821.         0x8984, 0xffffffff, 0x06000100,
  822.         0x8a18, 0xffffffff, 0x00000100,
  823.         0x92a0, 0xffffffff, 0x00000100,
  824.         0xc380, 0xffffffff, 0x00000100,
  825.         0x8b28, 0xffffffff, 0x00000100,
  826.         0x9144, 0xffffffff, 0x00000100,
  827.         0x8d88, 0xffffffff, 0x00000100,
  828.         0x8d8c, 0xffffffff, 0x00000100,
  829.         0x9030, 0xffffffff, 0x00000100,
  830.         0x9034, 0xffffffff, 0x00000100,
  831.         0x9038, 0xffffffff, 0x00000100,
  832.         0x903c, 0xffffffff, 0x00000100,
  833.         0xad80, 0xffffffff, 0x00000100,
  834.         0xac54, 0xffffffff, 0x00000100,
  835.         0x897c, 0xffffffff, 0x06000100,
  836.         0x9868, 0xffffffff, 0x00000100,
  837.         0x9510, 0xffffffff, 0x00000100,
  838.         0xaf04, 0xffffffff, 0x00000100,
  839.         0xae04, 0xffffffff, 0x00000100,
  840.         0x949c, 0xffffffff, 0x00000100,
  841.         0x802c, 0xffffffff, 0xe0000000,
  842.         0x9160, 0xffffffff, 0x00010000,
  843.         0x9164, 0xffffffff, 0x00030002,
  844.         0x9168, 0xffffffff, 0x00040007,
  845.         0x916c, 0xffffffff, 0x00060005,
  846.         0x9170, 0xffffffff, 0x00090008,
  847.         0x9174, 0xffffffff, 0x00020001,
  848.         0x9178, 0xffffffff, 0x00040003,
  849.         0x917c, 0xffffffff, 0x00000007,
  850.         0x9180, 0xffffffff, 0x00060005,
  851.         0x9184, 0xffffffff, 0x00090008,
  852.         0x9188, 0xffffffff, 0x00030002,
  853.         0x918c, 0xffffffff, 0x00050004,
  854.         0x9190, 0xffffffff, 0x00000008,
  855.         0x9194, 0xffffffff, 0x00070006,
  856.         0x9198, 0xffffffff, 0x000a0009,
  857.         0x919c, 0xffffffff, 0x00040003,
  858.         0x91a0, 0xffffffff, 0x00060005,
  859.         0x91a4, 0xffffffff, 0x00000009,
  860.         0x91a8, 0xffffffff, 0x00080007,
  861.         0x91ac, 0xffffffff, 0x000b000a,
  862.         0x91b0, 0xffffffff, 0x00050004,
  863.         0x91b4, 0xffffffff, 0x00070006,
  864.         0x91b8, 0xffffffff, 0x0008000b,
  865.         0x91bc, 0xffffffff, 0x000a0009,
  866.         0x91c0, 0xffffffff, 0x000d000c,
  867.         0x9200, 0xffffffff, 0x00090008,
  868.         0x9204, 0xffffffff, 0x000b000a,
  869.         0x9208, 0xffffffff, 0x000c000f,
  870.         0x920c, 0xffffffff, 0x000e000d,
  871.         0x9210, 0xffffffff, 0x00110010,
  872.         0x9214, 0xffffffff, 0x000a0009,
  873.         0x9218, 0xffffffff, 0x000c000b,
  874.         0x921c, 0xffffffff, 0x0000000f,
  875.         0x9220, 0xffffffff, 0x000e000d,
  876.         0x9224, 0xffffffff, 0x00110010,
  877.         0x9228, 0xffffffff, 0x000b000a,
  878.         0x922c, 0xffffffff, 0x000d000c,
  879.         0x9230, 0xffffffff, 0x00000010,
  880.         0x9234, 0xffffffff, 0x000f000e,
  881.         0x9238, 0xffffffff, 0x00120011,
  882.         0x923c, 0xffffffff, 0x000c000b,
  883.         0x9240, 0xffffffff, 0x000e000d,
  884.         0x9244, 0xffffffff, 0x00000011,
  885.         0x9248, 0xffffffff, 0x0010000f,
  886.         0x924c, 0xffffffff, 0x00130012,
  887.         0x9250, 0xffffffff, 0x000d000c,
  888.         0x9254, 0xffffffff, 0x000f000e,
  889.         0x9258, 0xffffffff, 0x00100013,
  890.         0x925c, 0xffffffff, 0x00120011,
  891.         0x9260, 0xffffffff, 0x00150014,
  892.         0x9150, 0xffffffff, 0x96940200,
  893.         0x8708, 0xffffffff, 0x00900100,
  894.         0xc478, 0xffffffff, 0x00000080,
  895.         0xc404, 0xffffffff, 0x0020003f,
  896.         0x30, 0xffffffff, 0x0000001c,
  897.         0x34, 0x000f0000, 0x000f0000,
  898.         0x160c, 0xffffffff, 0x00000100,
  899.         0x1024, 0xffffffff, 0x00000100,
  900.         0x102c, 0x00000101, 0x00000000,
  901.         0x20a8, 0xffffffff, 0x00000104,
  902.         0x264c, 0x000c0000, 0x000c0000,
  903.         0x2648, 0x000c0000, 0x000c0000,
  904.         0x55e4, 0xff000fff, 0x00000100,
  905.         0x55e8, 0x00000001, 0x00000001,
  906.         0x2f50, 0x00000001, 0x00000001,
  907.         0x30cc, 0xc0000fff, 0x00000104,
  908.         0xc1e4, 0x00000001, 0x00000001,
  909.         0xd0c0, 0xfffffff0, 0x00000100,
  910.         0xd8c0, 0xfffffff0, 0x00000100
  911. };
  912.  
  913. static const u32 oland_mgcg_cgcg_init[] =
  914. {
  915.         0xc400, 0xffffffff, 0xfffffffc,
  916.         0x802c, 0xffffffff, 0xe0000000,
  917.         0x9a60, 0xffffffff, 0x00000100,
  918.         0x92a4, 0xffffffff, 0x00000100,
  919.         0xc164, 0xffffffff, 0x00000100,
  920.         0x9774, 0xffffffff, 0x00000100,
  921.         0x8984, 0xffffffff, 0x06000100,
  922.         0x8a18, 0xffffffff, 0x00000100,
  923.         0x92a0, 0xffffffff, 0x00000100,
  924.         0xc380, 0xffffffff, 0x00000100,
  925.         0x8b28, 0xffffffff, 0x00000100,
  926.         0x9144, 0xffffffff, 0x00000100,
  927.         0x8d88, 0xffffffff, 0x00000100,
  928.         0x8d8c, 0xffffffff, 0x00000100,
  929.         0x9030, 0xffffffff, 0x00000100,
  930.         0x9034, 0xffffffff, 0x00000100,
  931.         0x9038, 0xffffffff, 0x00000100,
  932.         0x903c, 0xffffffff, 0x00000100,
  933.         0xad80, 0xffffffff, 0x00000100,
  934.         0xac54, 0xffffffff, 0x00000100,
  935.         0x897c, 0xffffffff, 0x06000100,
  936.         0x9868, 0xffffffff, 0x00000100,
  937.         0x9510, 0xffffffff, 0x00000100,
  938.         0xaf04, 0xffffffff, 0x00000100,
  939.         0xae04, 0xffffffff, 0x00000100,
  940.         0x949c, 0xffffffff, 0x00000100,
  941.         0x802c, 0xffffffff, 0xe0000000,
  942.         0x9160, 0xffffffff, 0x00010000,
  943.         0x9164, 0xffffffff, 0x00030002,
  944.         0x9168, 0xffffffff, 0x00040007,
  945.         0x916c, 0xffffffff, 0x00060005,
  946.         0x9170, 0xffffffff, 0x00090008,
  947.         0x9174, 0xffffffff, 0x00020001,
  948.         0x9178, 0xffffffff, 0x00040003,
  949.         0x917c, 0xffffffff, 0x00000007,
  950.         0x9180, 0xffffffff, 0x00060005,
  951.         0x9184, 0xffffffff, 0x00090008,
  952.         0x9188, 0xffffffff, 0x00030002,
  953.         0x918c, 0xffffffff, 0x00050004,
  954.         0x9190, 0xffffffff, 0x00000008,
  955.         0x9194, 0xffffffff, 0x00070006,
  956.         0x9198, 0xffffffff, 0x000a0009,
  957.         0x919c, 0xffffffff, 0x00040003,
  958.         0x91a0, 0xffffffff, 0x00060005,
  959.         0x91a4, 0xffffffff, 0x00000009,
  960.         0x91a8, 0xffffffff, 0x00080007,
  961.         0x91ac, 0xffffffff, 0x000b000a,
  962.         0x91b0, 0xffffffff, 0x00050004,
  963.         0x91b4, 0xffffffff, 0x00070006,
  964.         0x91b8, 0xffffffff, 0x0008000b,
  965.         0x91bc, 0xffffffff, 0x000a0009,
  966.         0x91c0, 0xffffffff, 0x000d000c,
  967.         0x91c4, 0xffffffff, 0x00060005,
  968.         0x91c8, 0xffffffff, 0x00080007,
  969.         0x91cc, 0xffffffff, 0x0000000b,
  970.         0x91d0, 0xffffffff, 0x000a0009,
  971.         0x91d4, 0xffffffff, 0x000d000c,
  972.         0x9150, 0xffffffff, 0x96940200,
  973.         0x8708, 0xffffffff, 0x00900100,
  974.         0xc478, 0xffffffff, 0x00000080,
  975.         0xc404, 0xffffffff, 0x0020003f,
  976.         0x30, 0xffffffff, 0x0000001c,
  977.         0x34, 0x000f0000, 0x000f0000,
  978.         0x160c, 0xffffffff, 0x00000100,
  979.         0x1024, 0xffffffff, 0x00000100,
  980.         0x102c, 0x00000101, 0x00000000,
  981.         0x20a8, 0xffffffff, 0x00000104,
  982.         0x264c, 0x000c0000, 0x000c0000,
  983.         0x2648, 0x000c0000, 0x000c0000,
  984.         0x55e4, 0xff000fff, 0x00000100,
  985.         0x55e8, 0x00000001, 0x00000001,
  986.         0x2f50, 0x00000001, 0x00000001,
  987.         0x30cc, 0xc0000fff, 0x00000104,
  988.         0xc1e4, 0x00000001, 0x00000001,
  989.         0xd0c0, 0xfffffff0, 0x00000100,
  990.         0xd8c0, 0xfffffff0, 0x00000100
  991. };
  992.  
  993. static const u32 hainan_mgcg_cgcg_init[] =
  994. {
  995.         0xc400, 0xffffffff, 0xfffffffc,
  996.         0x802c, 0xffffffff, 0xe0000000,
  997.         0x9a60, 0xffffffff, 0x00000100,
  998.         0x92a4, 0xffffffff, 0x00000100,
  999.         0xc164, 0xffffffff, 0x00000100,
  1000.         0x9774, 0xffffffff, 0x00000100,
  1001.         0x8984, 0xffffffff, 0x06000100,
  1002.         0x8a18, 0xffffffff, 0x00000100,
  1003.         0x92a0, 0xffffffff, 0x00000100,
  1004.         0xc380, 0xffffffff, 0x00000100,
  1005.         0x8b28, 0xffffffff, 0x00000100,
  1006.         0x9144, 0xffffffff, 0x00000100,
  1007.         0x8d88, 0xffffffff, 0x00000100,
  1008.         0x8d8c, 0xffffffff, 0x00000100,
  1009.         0x9030, 0xffffffff, 0x00000100,
  1010.         0x9034, 0xffffffff, 0x00000100,
  1011.         0x9038, 0xffffffff, 0x00000100,
  1012.         0x903c, 0xffffffff, 0x00000100,
  1013.         0xad80, 0xffffffff, 0x00000100,
  1014.         0xac54, 0xffffffff, 0x00000100,
  1015.         0x897c, 0xffffffff, 0x06000100,
  1016.         0x9868, 0xffffffff, 0x00000100,
  1017.         0x9510, 0xffffffff, 0x00000100,
  1018.         0xaf04, 0xffffffff, 0x00000100,
  1019.         0xae04, 0xffffffff, 0x00000100,
  1020.         0x949c, 0xffffffff, 0x00000100,
  1021.         0x802c, 0xffffffff, 0xe0000000,
  1022.         0x9160, 0xffffffff, 0x00010000,
  1023.         0x9164, 0xffffffff, 0x00030002,
  1024.         0x9168, 0xffffffff, 0x00040007,
  1025.         0x916c, 0xffffffff, 0x00060005,
  1026.         0x9170, 0xffffffff, 0x00090008,
  1027.         0x9174, 0xffffffff, 0x00020001,
  1028.         0x9178, 0xffffffff, 0x00040003,
  1029.         0x917c, 0xffffffff, 0x00000007,
  1030.         0x9180, 0xffffffff, 0x00060005,
  1031.         0x9184, 0xffffffff, 0x00090008,
  1032.         0x9188, 0xffffffff, 0x00030002,
  1033.         0x918c, 0xffffffff, 0x00050004,
  1034.         0x9190, 0xffffffff, 0x00000008,
  1035.         0x9194, 0xffffffff, 0x00070006,
  1036.         0x9198, 0xffffffff, 0x000a0009,
  1037.         0x919c, 0xffffffff, 0x00040003,
  1038.         0x91a0, 0xffffffff, 0x00060005,
  1039.         0x91a4, 0xffffffff, 0x00000009,
  1040.         0x91a8, 0xffffffff, 0x00080007,
  1041.         0x91ac, 0xffffffff, 0x000b000a,
  1042.         0x91b0, 0xffffffff, 0x00050004,
  1043.         0x91b4, 0xffffffff, 0x00070006,
  1044.         0x91b8, 0xffffffff, 0x0008000b,
  1045.         0x91bc, 0xffffffff, 0x000a0009,
  1046.         0x91c0, 0xffffffff, 0x000d000c,
  1047.         0x91c4, 0xffffffff, 0x00060005,
  1048.         0x91c8, 0xffffffff, 0x00080007,
  1049.         0x91cc, 0xffffffff, 0x0000000b,
  1050.         0x91d0, 0xffffffff, 0x000a0009,
  1051.         0x91d4, 0xffffffff, 0x000d000c,
  1052.         0x9150, 0xffffffff, 0x96940200,
  1053.         0x8708, 0xffffffff, 0x00900100,
  1054.         0xc478, 0xffffffff, 0x00000080,
  1055.         0xc404, 0xffffffff, 0x0020003f,
  1056.         0x30, 0xffffffff, 0x0000001c,
  1057.         0x34, 0x000f0000, 0x000f0000,
  1058.         0x160c, 0xffffffff, 0x00000100,
  1059.         0x1024, 0xffffffff, 0x00000100,
  1060.         0x20a8, 0xffffffff, 0x00000104,
  1061.         0x264c, 0x000c0000, 0x000c0000,
  1062.         0x2648, 0x000c0000, 0x000c0000,
  1063.         0x2f50, 0x00000001, 0x00000001,
  1064.         0x30cc, 0xc0000fff, 0x00000104,
  1065.         0xc1e4, 0x00000001, 0x00000001,
  1066.         0xd0c0, 0xfffffff0, 0x00000100,
  1067.         0xd8c0, 0xfffffff0, 0x00000100
  1068. };
  1069.  
  1070. static u32 verde_pg_init[] =
  1071. {
  1072.         0x353c, 0xffffffff, 0x40000,
  1073.         0x3538, 0xffffffff, 0x200010ff,
  1074.         0x353c, 0xffffffff, 0x0,
  1075.         0x353c, 0xffffffff, 0x0,
  1076.         0x353c, 0xffffffff, 0x0,
  1077.         0x353c, 0xffffffff, 0x0,
  1078.         0x353c, 0xffffffff, 0x0,
  1079.         0x353c, 0xffffffff, 0x7007,
  1080.         0x3538, 0xffffffff, 0x300010ff,
  1081.         0x353c, 0xffffffff, 0x0,
  1082.         0x353c, 0xffffffff, 0x0,
  1083.         0x353c, 0xffffffff, 0x0,
  1084.         0x353c, 0xffffffff, 0x0,
  1085.         0x353c, 0xffffffff, 0x0,
  1086.         0x353c, 0xffffffff, 0x400000,
  1087.         0x3538, 0xffffffff, 0x100010ff,
  1088.         0x353c, 0xffffffff, 0x0,
  1089.         0x353c, 0xffffffff, 0x0,
  1090.         0x353c, 0xffffffff, 0x0,
  1091.         0x353c, 0xffffffff, 0x0,
  1092.         0x353c, 0xffffffff, 0x0,
  1093.         0x353c, 0xffffffff, 0x120200,
  1094.         0x3538, 0xffffffff, 0x500010ff,
  1095.         0x353c, 0xffffffff, 0x0,
  1096.         0x353c, 0xffffffff, 0x0,
  1097.         0x353c, 0xffffffff, 0x0,
  1098.         0x353c, 0xffffffff, 0x0,
  1099.         0x353c, 0xffffffff, 0x0,
  1100.         0x353c, 0xffffffff, 0x1e1e16,
  1101.         0x3538, 0xffffffff, 0x600010ff,
  1102.         0x353c, 0xffffffff, 0x0,
  1103.         0x353c, 0xffffffff, 0x0,
  1104.         0x353c, 0xffffffff, 0x0,
  1105.         0x353c, 0xffffffff, 0x0,
  1106.         0x353c, 0xffffffff, 0x0,
  1107.         0x353c, 0xffffffff, 0x171f1e,
  1108.         0x3538, 0xffffffff, 0x700010ff,
  1109.         0x353c, 0xffffffff, 0x0,
  1110.         0x353c, 0xffffffff, 0x0,
  1111.         0x353c, 0xffffffff, 0x0,
  1112.         0x353c, 0xffffffff, 0x0,
  1113.         0x353c, 0xffffffff, 0x0,
  1114.         0x353c, 0xffffffff, 0x0,
  1115.         0x3538, 0xffffffff, 0x9ff,
  1116.         0x3500, 0xffffffff, 0x0,
  1117.         0x3504, 0xffffffff, 0x10000800,
  1118.         0x3504, 0xffffffff, 0xf,
  1119.         0x3504, 0xffffffff, 0xf,
  1120.         0x3500, 0xffffffff, 0x4,
  1121.         0x3504, 0xffffffff, 0x1000051e,
  1122.         0x3504, 0xffffffff, 0xffff,
  1123.         0x3504, 0xffffffff, 0xffff,
  1124.         0x3500, 0xffffffff, 0x8,
  1125.         0x3504, 0xffffffff, 0x80500,
  1126.         0x3500, 0xffffffff, 0x12,
  1127.         0x3504, 0xffffffff, 0x9050c,
  1128.         0x3500, 0xffffffff, 0x1d,
  1129.         0x3504, 0xffffffff, 0xb052c,
  1130.         0x3500, 0xffffffff, 0x2a,
  1131.         0x3504, 0xffffffff, 0x1053e,
  1132.         0x3500, 0xffffffff, 0x2d,
  1133.         0x3504, 0xffffffff, 0x10546,
  1134.         0x3500, 0xffffffff, 0x30,
  1135.         0x3504, 0xffffffff, 0xa054e,
  1136.         0x3500, 0xffffffff, 0x3c,
  1137.         0x3504, 0xffffffff, 0x1055f,
  1138.         0x3500, 0xffffffff, 0x3f,
  1139.         0x3504, 0xffffffff, 0x10567,
  1140.         0x3500, 0xffffffff, 0x42,
  1141.         0x3504, 0xffffffff, 0x1056f,
  1142.         0x3500, 0xffffffff, 0x45,
  1143.         0x3504, 0xffffffff, 0x10572,
  1144.         0x3500, 0xffffffff, 0x48,
  1145.         0x3504, 0xffffffff, 0x20575,
  1146.         0x3500, 0xffffffff, 0x4c,
  1147.         0x3504, 0xffffffff, 0x190801,
  1148.         0x3500, 0xffffffff, 0x67,
  1149.         0x3504, 0xffffffff, 0x1082a,
  1150.         0x3500, 0xffffffff, 0x6a,
  1151.         0x3504, 0xffffffff, 0x1b082d,
  1152.         0x3500, 0xffffffff, 0x87,
  1153.         0x3504, 0xffffffff, 0x310851,
  1154.         0x3500, 0xffffffff, 0xba,
  1155.         0x3504, 0xffffffff, 0x891,
  1156.         0x3500, 0xffffffff, 0xbc,
  1157.         0x3504, 0xffffffff, 0x893,
  1158.         0x3500, 0xffffffff, 0xbe,
  1159.         0x3504, 0xffffffff, 0x20895,
  1160.         0x3500, 0xffffffff, 0xc2,
  1161.         0x3504, 0xffffffff, 0x20899,
  1162.         0x3500, 0xffffffff, 0xc6,
  1163.         0x3504, 0xffffffff, 0x2089d,
  1164.         0x3500, 0xffffffff, 0xca,
  1165.         0x3504, 0xffffffff, 0x8a1,
  1166.         0x3500, 0xffffffff, 0xcc,
  1167.         0x3504, 0xffffffff, 0x8a3,
  1168.         0x3500, 0xffffffff, 0xce,
  1169.         0x3504, 0xffffffff, 0x308a5,
  1170.         0x3500, 0xffffffff, 0xd3,
  1171.         0x3504, 0xffffffff, 0x6d08cd,
  1172.         0x3500, 0xffffffff, 0x142,
  1173.         0x3504, 0xffffffff, 0x2000095a,
  1174.         0x3504, 0xffffffff, 0x1,
  1175.         0x3500, 0xffffffff, 0x144,
  1176.         0x3504, 0xffffffff, 0x301f095b,
  1177.         0x3500, 0xffffffff, 0x165,
  1178.         0x3504, 0xffffffff, 0xc094d,
  1179.         0x3500, 0xffffffff, 0x173,
  1180.         0x3504, 0xffffffff, 0xf096d,
  1181.         0x3500, 0xffffffff, 0x184,
  1182.         0x3504, 0xffffffff, 0x15097f,
  1183.         0x3500, 0xffffffff, 0x19b,
  1184.         0x3504, 0xffffffff, 0xc0998,
  1185.         0x3500, 0xffffffff, 0x1a9,
  1186.         0x3504, 0xffffffff, 0x409a7,
  1187.         0x3500, 0xffffffff, 0x1af,
  1188.         0x3504, 0xffffffff, 0xcdc,
  1189.         0x3500, 0xffffffff, 0x1b1,
  1190.         0x3504, 0xffffffff, 0x800,
  1191.         0x3508, 0xffffffff, 0x6c9b2000,
  1192.         0x3510, 0xfc00, 0x2000,
  1193.         0x3544, 0xffffffff, 0xfc0,
  1194.         0x28d4, 0x00000100, 0x100
  1195. };
  1196.  
  1197. static void si_init_golden_registers(struct radeon_device *rdev)
  1198. {
  1199.         switch (rdev->family) {
  1200.         case CHIP_TAHITI:
  1201.                 radeon_program_register_sequence(rdev,
  1202.                                                  tahiti_golden_registers,
  1203.                                                  (const u32)ARRAY_SIZE(tahiti_golden_registers));
  1204.                 radeon_program_register_sequence(rdev,
  1205.                                                  tahiti_golden_rlc_registers,
  1206.                                                  (const u32)ARRAY_SIZE(tahiti_golden_rlc_registers));
  1207.                 radeon_program_register_sequence(rdev,
  1208.                                                  tahiti_mgcg_cgcg_init,
  1209.                                                  (const u32)ARRAY_SIZE(tahiti_mgcg_cgcg_init));
  1210.                 radeon_program_register_sequence(rdev,
  1211.                                                  tahiti_golden_registers2,
  1212.                                                  (const u32)ARRAY_SIZE(tahiti_golden_registers2));
  1213.                 break;
  1214.         case CHIP_PITCAIRN:
  1215.                 radeon_program_register_sequence(rdev,
  1216.                                                  pitcairn_golden_registers,
  1217.                                                  (const u32)ARRAY_SIZE(pitcairn_golden_registers));
  1218.                 radeon_program_register_sequence(rdev,
  1219.                                                  pitcairn_golden_rlc_registers,
  1220.                                                  (const u32)ARRAY_SIZE(pitcairn_golden_rlc_registers));
  1221.                 radeon_program_register_sequence(rdev,
  1222.                                                  pitcairn_mgcg_cgcg_init,
  1223.                                                  (const u32)ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
  1224.                 break;
  1225.         case CHIP_VERDE:
  1226.                 radeon_program_register_sequence(rdev,
  1227.                                                  verde_golden_registers,
  1228.                                                  (const u32)ARRAY_SIZE(verde_golden_registers));
  1229.                 radeon_program_register_sequence(rdev,
  1230.                                                  verde_golden_rlc_registers,
  1231.                                                  (const u32)ARRAY_SIZE(verde_golden_rlc_registers));
  1232.                 radeon_program_register_sequence(rdev,
  1233.                                                  verde_mgcg_cgcg_init,
  1234.                                                  (const u32)ARRAY_SIZE(verde_mgcg_cgcg_init));
  1235.                 radeon_program_register_sequence(rdev,
  1236.                                                  verde_pg_init,
  1237.                                                  (const u32)ARRAY_SIZE(verde_pg_init));
  1238.                 break;
  1239.         case CHIP_OLAND:
  1240.                 radeon_program_register_sequence(rdev,
  1241.                                                  oland_golden_registers,
  1242.                                                  (const u32)ARRAY_SIZE(oland_golden_registers));
  1243.                 radeon_program_register_sequence(rdev,
  1244.                                                  oland_golden_rlc_registers,
  1245.                                                  (const u32)ARRAY_SIZE(oland_golden_rlc_registers));
  1246.                 radeon_program_register_sequence(rdev,
  1247.                                                  oland_mgcg_cgcg_init,
  1248.                                                  (const u32)ARRAY_SIZE(oland_mgcg_cgcg_init));
  1249.                 break;
  1250.         case CHIP_HAINAN:
  1251.                 radeon_program_register_sequence(rdev,
  1252.                                                  hainan_golden_registers,
  1253.                                                  (const u32)ARRAY_SIZE(hainan_golden_registers));
  1254.                 radeon_program_register_sequence(rdev,
  1255.                                                  hainan_golden_registers2,
  1256.                                                  (const u32)ARRAY_SIZE(hainan_golden_registers2));
  1257.                 radeon_program_register_sequence(rdev,
  1258.                                                  hainan_mgcg_cgcg_init,
  1259.                                                  (const u32)ARRAY_SIZE(hainan_mgcg_cgcg_init));
  1260.                 break;
  1261.         default:
  1262.                 break;
  1263.         }
  1264. }
  1265.  
  1266. #define PCIE_BUS_CLK                10000
  1267. #define TCLK                        (PCIE_BUS_CLK / 10)
  1268.  
  1269. /**
  1270.  * si_get_xclk - get the xclk
  1271.  *
  1272.  * @rdev: radeon_device pointer
  1273.  *
  1274.  * Returns the reference clock used by the gfx engine
  1275.  * (SI).
  1276.  */
  1277. u32 si_get_xclk(struct radeon_device *rdev)
  1278. {
  1279.         u32 reference_clock = rdev->clock.spll.reference_freq;
  1280.         u32 tmp;
  1281.  
  1282.         tmp = RREG32(CG_CLKPIN_CNTL_2);
  1283.         if (tmp & MUX_TCLK_TO_XCLK)
  1284.                 return TCLK;
  1285.  
  1286.         tmp = RREG32(CG_CLKPIN_CNTL);
  1287.         if (tmp & XTALIN_DIVIDE)
  1288.                 return reference_clock / 4;
  1289.  
  1290.         return reference_clock;
  1291. }
  1292.  
  1293. /* get temperature in millidegrees */
  1294. int si_get_temp(struct radeon_device *rdev)
  1295. {
  1296.         u32 temp;
  1297.         int actual_temp = 0;
  1298.  
  1299.         temp = (RREG32(CG_MULT_THERMAL_STATUS) & CTF_TEMP_MASK) >>
  1300.                 CTF_TEMP_SHIFT;
  1301.  
  1302.         if (temp & 0x200)
  1303.                 actual_temp = 255;
  1304.         else
  1305.                 actual_temp = temp & 0x1ff;
  1306.  
  1307.         actual_temp = (actual_temp * 1000);
  1308.  
  1309.         return actual_temp;
  1310. }
  1311.  
  1312. #define TAHITI_IO_MC_REGS_SIZE 36
  1313.  
  1314. static const u32 tahiti_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
  1315.         {0x0000006f, 0x03044000},
  1316.         {0x00000070, 0x0480c018},
  1317.         {0x00000071, 0x00000040},
  1318.         {0x00000072, 0x01000000},
  1319.         {0x00000074, 0x000000ff},
  1320.         {0x00000075, 0x00143400},
  1321.         {0x00000076, 0x08ec0800},
  1322.         {0x00000077, 0x040000cc},
  1323.         {0x00000079, 0x00000000},
  1324.         {0x0000007a, 0x21000409},
  1325.         {0x0000007c, 0x00000000},
  1326.         {0x0000007d, 0xe8000000},
  1327.         {0x0000007e, 0x044408a8},
  1328.         {0x0000007f, 0x00000003},
  1329.         {0x00000080, 0x00000000},
  1330.         {0x00000081, 0x01000000},
  1331.         {0x00000082, 0x02000000},
  1332.         {0x00000083, 0x00000000},
  1333.         {0x00000084, 0xe3f3e4f4},
  1334.         {0x00000085, 0x00052024},
  1335.         {0x00000087, 0x00000000},
  1336.         {0x00000088, 0x66036603},
  1337.         {0x00000089, 0x01000000},
  1338.         {0x0000008b, 0x1c0a0000},
  1339.         {0x0000008c, 0xff010000},
  1340.         {0x0000008e, 0xffffefff},
  1341.         {0x0000008f, 0xfff3efff},
  1342.         {0x00000090, 0xfff3efbf},
  1343.         {0x00000094, 0x00101101},
  1344.         {0x00000095, 0x00000fff},
  1345.         {0x00000096, 0x00116fff},
  1346.         {0x00000097, 0x60010000},
  1347.         {0x00000098, 0x10010000},
  1348.         {0x00000099, 0x00006000},
  1349.         {0x0000009a, 0x00001000},
  1350.         {0x0000009f, 0x00a77400}
  1351. };
  1352.  
  1353. static const u32 pitcairn_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
  1354.         {0x0000006f, 0x03044000},
  1355.         {0x00000070, 0x0480c018},
  1356.         {0x00000071, 0x00000040},
  1357.         {0x00000072, 0x01000000},
  1358.         {0x00000074, 0x000000ff},
  1359.         {0x00000075, 0x00143400},
  1360.         {0x00000076, 0x08ec0800},
  1361.         {0x00000077, 0x040000cc},
  1362.         {0x00000079, 0x00000000},
  1363.         {0x0000007a, 0x21000409},
  1364.         {0x0000007c, 0x00000000},
  1365.         {0x0000007d, 0xe8000000},
  1366.         {0x0000007e, 0x044408a8},
  1367.         {0x0000007f, 0x00000003},
  1368.         {0x00000080, 0x00000000},
  1369.         {0x00000081, 0x01000000},
  1370.         {0x00000082, 0x02000000},
  1371.         {0x00000083, 0x00000000},
  1372.         {0x00000084, 0xe3f3e4f4},
  1373.         {0x00000085, 0x00052024},
  1374.         {0x00000087, 0x00000000},
  1375.         {0x00000088, 0x66036603},
  1376.         {0x00000089, 0x01000000},
  1377.         {0x0000008b, 0x1c0a0000},
  1378.         {0x0000008c, 0xff010000},
  1379.         {0x0000008e, 0xffffefff},
  1380.         {0x0000008f, 0xfff3efff},
  1381.         {0x00000090, 0xfff3efbf},
  1382.         {0x00000094, 0x00101101},
  1383.         {0x00000095, 0x00000fff},
  1384.         {0x00000096, 0x00116fff},
  1385.         {0x00000097, 0x60010000},
  1386.         {0x00000098, 0x10010000},
  1387.         {0x00000099, 0x00006000},
  1388.         {0x0000009a, 0x00001000},
  1389.         {0x0000009f, 0x00a47400}
  1390. };
  1391.  
  1392. static const u32 verde_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
  1393.         {0x0000006f, 0x03044000},
  1394.         {0x00000070, 0x0480c018},
  1395.         {0x00000071, 0x00000040},
  1396.         {0x00000072, 0x01000000},
  1397.         {0x00000074, 0x000000ff},
  1398.         {0x00000075, 0x00143400},
  1399.         {0x00000076, 0x08ec0800},
  1400.         {0x00000077, 0x040000cc},
  1401.         {0x00000079, 0x00000000},
  1402.         {0x0000007a, 0x21000409},
  1403.         {0x0000007c, 0x00000000},
  1404.         {0x0000007d, 0xe8000000},
  1405.         {0x0000007e, 0x044408a8},
  1406.         {0x0000007f, 0x00000003},
  1407.         {0x00000080, 0x00000000},
  1408.         {0x00000081, 0x01000000},
  1409.         {0x00000082, 0x02000000},
  1410.         {0x00000083, 0x00000000},
  1411.         {0x00000084, 0xe3f3e4f4},
  1412.         {0x00000085, 0x00052024},
  1413.         {0x00000087, 0x00000000},
  1414.         {0x00000088, 0x66036603},
  1415.         {0x00000089, 0x01000000},
  1416.         {0x0000008b, 0x1c0a0000},
  1417.         {0x0000008c, 0xff010000},
  1418.         {0x0000008e, 0xffffefff},
  1419.         {0x0000008f, 0xfff3efff},
  1420.         {0x00000090, 0xfff3efbf},
  1421.         {0x00000094, 0x00101101},
  1422.         {0x00000095, 0x00000fff},
  1423.         {0x00000096, 0x00116fff},
  1424.         {0x00000097, 0x60010000},
  1425.         {0x00000098, 0x10010000},
  1426.         {0x00000099, 0x00006000},
  1427.         {0x0000009a, 0x00001000},
  1428.         {0x0000009f, 0x00a37400}
  1429. };
  1430.  
  1431. static const u32 oland_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
  1432.         {0x0000006f, 0x03044000},
  1433.         {0x00000070, 0x0480c018},
  1434.         {0x00000071, 0x00000040},
  1435.         {0x00000072, 0x01000000},
  1436.         {0x00000074, 0x000000ff},
  1437.         {0x00000075, 0x00143400},
  1438.         {0x00000076, 0x08ec0800},
  1439.         {0x00000077, 0x040000cc},
  1440.         {0x00000079, 0x00000000},
  1441.         {0x0000007a, 0x21000409},
  1442.         {0x0000007c, 0x00000000},
  1443.         {0x0000007d, 0xe8000000},
  1444.         {0x0000007e, 0x044408a8},
  1445.         {0x0000007f, 0x00000003},
  1446.         {0x00000080, 0x00000000},
  1447.         {0x00000081, 0x01000000},
  1448.         {0x00000082, 0x02000000},
  1449.         {0x00000083, 0x00000000},
  1450.         {0x00000084, 0xe3f3e4f4},
  1451.         {0x00000085, 0x00052024},
  1452.         {0x00000087, 0x00000000},
  1453.         {0x00000088, 0x66036603},
  1454.         {0x00000089, 0x01000000},
  1455.         {0x0000008b, 0x1c0a0000},
  1456.         {0x0000008c, 0xff010000},
  1457.         {0x0000008e, 0xffffefff},
  1458.         {0x0000008f, 0xfff3efff},
  1459.         {0x00000090, 0xfff3efbf},
  1460.         {0x00000094, 0x00101101},
  1461.         {0x00000095, 0x00000fff},
  1462.         {0x00000096, 0x00116fff},
  1463.         {0x00000097, 0x60010000},
  1464.         {0x00000098, 0x10010000},
  1465.         {0x00000099, 0x00006000},
  1466.         {0x0000009a, 0x00001000},
  1467.         {0x0000009f, 0x00a17730}
  1468. };
  1469.  
  1470. static const u32 hainan_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
  1471.         {0x0000006f, 0x03044000},
  1472.         {0x00000070, 0x0480c018},
  1473.         {0x00000071, 0x00000040},
  1474.         {0x00000072, 0x01000000},
  1475.         {0x00000074, 0x000000ff},
  1476.         {0x00000075, 0x00143400},
  1477.         {0x00000076, 0x08ec0800},
  1478.         {0x00000077, 0x040000cc},
  1479.         {0x00000079, 0x00000000},
  1480.         {0x0000007a, 0x21000409},
  1481.         {0x0000007c, 0x00000000},
  1482.         {0x0000007d, 0xe8000000},
  1483.         {0x0000007e, 0x044408a8},
  1484.         {0x0000007f, 0x00000003},
  1485.         {0x00000080, 0x00000000},
  1486.         {0x00000081, 0x01000000},
  1487.         {0x00000082, 0x02000000},
  1488.         {0x00000083, 0x00000000},
  1489.         {0x00000084, 0xe3f3e4f4},
  1490.         {0x00000085, 0x00052024},
  1491.         {0x00000087, 0x00000000},
  1492.         {0x00000088, 0x66036603},
  1493.         {0x00000089, 0x01000000},
  1494.         {0x0000008b, 0x1c0a0000},
  1495.         {0x0000008c, 0xff010000},
  1496.         {0x0000008e, 0xffffefff},
  1497.         {0x0000008f, 0xfff3efff},
  1498.         {0x00000090, 0xfff3efbf},
  1499.         {0x00000094, 0x00101101},
  1500.         {0x00000095, 0x00000fff},
  1501.         {0x00000096, 0x00116fff},
  1502.         {0x00000097, 0x60010000},
  1503.         {0x00000098, 0x10010000},
  1504.         {0x00000099, 0x00006000},
  1505.         {0x0000009a, 0x00001000},
  1506.         {0x0000009f, 0x00a07730}
  1507. };
  1508.  
  1509. /* ucode loading */
  1510. int si_mc_load_microcode(struct radeon_device *rdev)
  1511. {
  1512.         const __be32 *fw_data = NULL;
  1513.         const __le32 *new_fw_data = NULL;
  1514.         u32 running, blackout = 0;
  1515.         u32 *io_mc_regs = NULL;
  1516.         const __le32 *new_io_mc_regs = NULL;
  1517.         int i, regs_size, ucode_size;
  1518.  
  1519.         if (!rdev->mc_fw)
  1520.                 return -EINVAL;
  1521.  
  1522.         if (rdev->new_fw) {
  1523.                 const struct mc_firmware_header_v1_0 *hdr =
  1524.                         (const struct mc_firmware_header_v1_0 *)rdev->mc_fw->data;
  1525.  
  1526.                 radeon_ucode_print_mc_hdr(&hdr->header);
  1527.                 regs_size = le32_to_cpu(hdr->io_debug_size_bytes) / (4 * 2);
  1528.                 new_io_mc_regs = (const __le32 *)
  1529.                         (rdev->mc_fw->data + le32_to_cpu(hdr->io_debug_array_offset_bytes));
  1530.                 ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
  1531.                 new_fw_data = (const __le32 *)
  1532.                         (rdev->mc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
  1533.         } else {
  1534.         ucode_size = rdev->mc_fw->size / 4;
  1535.  
  1536.         switch (rdev->family) {
  1537.         case CHIP_TAHITI:
  1538.                 io_mc_regs = (u32 *)&tahiti_io_mc_regs;
  1539.                 regs_size = TAHITI_IO_MC_REGS_SIZE;
  1540.                 break;
  1541.         case CHIP_PITCAIRN:
  1542.                 io_mc_regs = (u32 *)&pitcairn_io_mc_regs;
  1543.                 regs_size = TAHITI_IO_MC_REGS_SIZE;
  1544.                 break;
  1545.         case CHIP_VERDE:
  1546.         default:
  1547.                 io_mc_regs = (u32 *)&verde_io_mc_regs;
  1548.                 regs_size = TAHITI_IO_MC_REGS_SIZE;
  1549.                 break;
  1550.         case CHIP_OLAND:
  1551.                 io_mc_regs = (u32 *)&oland_io_mc_regs;
  1552.                 regs_size = TAHITI_IO_MC_REGS_SIZE;
  1553.                 break;
  1554.         case CHIP_HAINAN:
  1555.                 io_mc_regs = (u32 *)&hainan_io_mc_regs;
  1556.                 regs_size = TAHITI_IO_MC_REGS_SIZE;
  1557.                 break;
  1558.         }
  1559.                 fw_data = (const __be32 *)rdev->mc_fw->data;
  1560.         }
  1561.  
  1562.         running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
  1563.  
  1564.         if (running == 0) {
  1565.                 if (running) {
  1566.                         blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
  1567.                         WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1);
  1568.                 }
  1569.  
  1570.                 /* reset the engine and set to writable */
  1571.                 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
  1572.                 WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
  1573.  
  1574.                 /* load mc io regs */
  1575.                 for (i = 0; i < regs_size; i++) {
  1576.                         if (rdev->new_fw) {
  1577.                                 WREG32(MC_SEQ_IO_DEBUG_INDEX, le32_to_cpup(new_io_mc_regs++));
  1578.                                 WREG32(MC_SEQ_IO_DEBUG_DATA, le32_to_cpup(new_io_mc_regs++));
  1579.                         } else {
  1580.                         WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
  1581.                         WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
  1582.                 }
  1583.                 }
  1584.                 /* load the MC ucode */
  1585.                 for (i = 0; i < ucode_size; i++) {
  1586.                         if (rdev->new_fw)
  1587.                                 WREG32(MC_SEQ_SUP_PGM, le32_to_cpup(new_fw_data++));
  1588.                         else
  1589.                         WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
  1590.                 }
  1591.  
  1592.                 /* put the engine back into the active state */
  1593.                 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
  1594.                 WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
  1595.                 WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
  1596.  
  1597.                 /* wait for training to complete */
  1598.                 for (i = 0; i < rdev->usec_timeout; i++) {
  1599.                         if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D0)
  1600.                                 break;
  1601.                         udelay(1);
  1602.                 }
  1603.                 for (i = 0; i < rdev->usec_timeout; i++) {
  1604.                         if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D1)
  1605.                                 break;
  1606.                         udelay(1);
  1607.                 }
  1608.  
  1609.                 if (running)
  1610.                         WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
  1611.         }
  1612.  
  1613.         return 0;
  1614. }
  1615.  
  1616. static int si_init_microcode(struct radeon_device *rdev)
  1617. {
  1618.         const char *chip_name;
  1619.         const char *new_chip_name;
  1620.         size_t pfp_req_size, me_req_size, ce_req_size, rlc_req_size, mc_req_size;
  1621.         size_t smc_req_size, mc2_req_size;
  1622.         char fw_name[30];
  1623.         int err;
  1624.         int new_fw = 0;
  1625.  
  1626.         DRM_DEBUG("\n");
  1627.  
  1628.         switch (rdev->family) {
  1629.         case CHIP_TAHITI:
  1630.                 chip_name = "TAHITI";
  1631.                 new_chip_name = "tahiti";
  1632.                 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
  1633.                 me_req_size = SI_PM4_UCODE_SIZE * 4;
  1634.                 ce_req_size = SI_CE_UCODE_SIZE * 4;
  1635.                 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
  1636.                 mc_req_size = SI_MC_UCODE_SIZE * 4;
  1637.                 mc2_req_size = TAHITI_MC_UCODE_SIZE * 4;
  1638.                 smc_req_size = ALIGN(TAHITI_SMC_UCODE_SIZE, 4);
  1639.                 break;
  1640.         case CHIP_PITCAIRN:
  1641.                 chip_name = "PITCAIRN";
  1642.                 new_chip_name = "pitcairn";
  1643.                 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
  1644.                 me_req_size = SI_PM4_UCODE_SIZE * 4;
  1645.                 ce_req_size = SI_CE_UCODE_SIZE * 4;
  1646.                 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
  1647.                 mc_req_size = SI_MC_UCODE_SIZE * 4;
  1648.                 mc2_req_size = PITCAIRN_MC_UCODE_SIZE * 4;
  1649.                 smc_req_size = ALIGN(PITCAIRN_SMC_UCODE_SIZE, 4);
  1650.                 break;
  1651.         case CHIP_VERDE:
  1652.                 chip_name = "VERDE";
  1653.                 new_chip_name = "verde";
  1654.                 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
  1655.                 me_req_size = SI_PM4_UCODE_SIZE * 4;
  1656.                 ce_req_size = SI_CE_UCODE_SIZE * 4;
  1657.                 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
  1658.                 mc_req_size = SI_MC_UCODE_SIZE * 4;
  1659.                 mc2_req_size = VERDE_MC_UCODE_SIZE * 4;
  1660.                 smc_req_size = ALIGN(VERDE_SMC_UCODE_SIZE, 4);
  1661.                 break;
  1662.         case CHIP_OLAND:
  1663.                 chip_name = "OLAND";
  1664.                 new_chip_name = "oland";
  1665.                 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
  1666.                 me_req_size = SI_PM4_UCODE_SIZE * 4;
  1667.                 ce_req_size = SI_CE_UCODE_SIZE * 4;
  1668.                 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
  1669.                 mc_req_size = mc2_req_size = OLAND_MC_UCODE_SIZE * 4;
  1670.                 smc_req_size = ALIGN(OLAND_SMC_UCODE_SIZE, 4);
  1671.                 break;
  1672.         case CHIP_HAINAN:
  1673.                 chip_name = "HAINAN";
  1674.                 new_chip_name = "hainan";
  1675.                 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
  1676.                 me_req_size = SI_PM4_UCODE_SIZE * 4;
  1677.                 ce_req_size = SI_CE_UCODE_SIZE * 4;
  1678.                 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
  1679.                 mc_req_size = mc2_req_size = OLAND_MC_UCODE_SIZE * 4;
  1680.                 smc_req_size = ALIGN(HAINAN_SMC_UCODE_SIZE, 4);
  1681.                 break;
  1682.         default: BUG();
  1683.         }
  1684.  
  1685.         DRM_INFO("Loading %s Microcode\n", new_chip_name);
  1686.  
  1687.         snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", new_chip_name);
  1688.         err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
  1689.         if (err) {
  1690.         snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
  1691.         err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
  1692.         if (err)
  1693.                 goto out;
  1694.         if (rdev->pfp_fw->size != pfp_req_size) {
  1695.                 printk(KERN_ERR
  1696.                        "si_cp: Bogus length %zu in firmware \"%s\"\n",
  1697.                        rdev->pfp_fw->size, fw_name);
  1698.                 err = -EINVAL;
  1699.                 goto out;
  1700.         }
  1701.         } else {
  1702.                 err = radeon_ucode_validate(rdev->pfp_fw);
  1703.                 if (err) {
  1704.                         printk(KERN_ERR
  1705.                                "si_cp: validation failed for firmware \"%s\"\n",
  1706.                                fw_name);
  1707.                         goto out;
  1708.                 } else {
  1709.                         new_fw++;
  1710.                 }
  1711.         }
  1712.  
  1713.         snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", new_chip_name);
  1714.         err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
  1715.         if (err) {
  1716.         snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
  1717.         err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
  1718.         if (err)
  1719.                 goto out;
  1720.         if (rdev->me_fw->size != me_req_size) {
  1721.                 printk(KERN_ERR
  1722.                        "si_cp: Bogus length %zu in firmware \"%s\"\n",
  1723.                        rdev->me_fw->size, fw_name);
  1724.                 err = -EINVAL;
  1725.         }
  1726.         } else {
  1727.                 err = radeon_ucode_validate(rdev->me_fw);
  1728.                 if (err) {
  1729.                         printk(KERN_ERR
  1730.                                "si_cp: validation failed for firmware \"%s\"\n",
  1731.                                fw_name);
  1732.                         goto out;
  1733.                 } else {
  1734.                         new_fw++;
  1735.                 }
  1736.         }
  1737.  
  1738.         snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", new_chip_name);
  1739.         err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev);
  1740.         if (err) {
  1741.         snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
  1742.         err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev);
  1743.         if (err)
  1744.                 goto out;
  1745.         if (rdev->ce_fw->size != ce_req_size) {
  1746.                 printk(KERN_ERR
  1747.                        "si_cp: Bogus length %zu in firmware \"%s\"\n",
  1748.                        rdev->ce_fw->size, fw_name);
  1749.                 err = -EINVAL;
  1750.         }
  1751.         } else {
  1752.                 err = radeon_ucode_validate(rdev->ce_fw);
  1753.                 if (err) {
  1754.                         printk(KERN_ERR
  1755.                                "si_cp: validation failed for firmware \"%s\"\n",
  1756.                                fw_name);
  1757.                         goto out;
  1758.                 } else {
  1759.                         new_fw++;
  1760.                 }
  1761.         }
  1762.  
  1763.         snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", new_chip_name);
  1764.         err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
  1765.         if (err) {
  1766.                 snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name);
  1767.         err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
  1768.         if (err)
  1769.                 goto out;
  1770.         if (rdev->rlc_fw->size != rlc_req_size) {
  1771.                 printk(KERN_ERR
  1772.                        "si_rlc: Bogus length %zu in firmware \"%s\"\n",
  1773.                        rdev->rlc_fw->size, fw_name);
  1774.                 err = -EINVAL;
  1775.         }
  1776.         } else {
  1777.                 err = radeon_ucode_validate(rdev->rlc_fw);
  1778.                 if (err) {
  1779.                         printk(KERN_ERR
  1780.                                "si_cp: validation failed for firmware \"%s\"\n",
  1781.                                fw_name);
  1782.                         goto out;
  1783.                 } else {
  1784.                         new_fw++;
  1785.                 }
  1786.         }
  1787.  
  1788.         snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", new_chip_name);
  1789.         err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
  1790.         if (err) {
  1791.         snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name);
  1792.         err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
  1793.         if (err) {
  1794.         snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
  1795.         err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
  1796.         if (err)
  1797.                 goto out;
  1798.         }
  1799.         if ((rdev->mc_fw->size != mc_req_size) &&
  1800.             (rdev->mc_fw->size != mc2_req_size)) {
  1801.                 printk(KERN_ERR
  1802.                        "si_mc: Bogus length %zu in firmware \"%s\"\n",
  1803.                        rdev->mc_fw->size, fw_name);
  1804.                 err = -EINVAL;
  1805.         }
  1806.         DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size);
  1807.         } else {
  1808.                 err = radeon_ucode_validate(rdev->mc_fw);
  1809.                 if (err) {
  1810.                         printk(KERN_ERR
  1811.                                "si_cp: validation failed for firmware \"%s\"\n",
  1812.                                fw_name);
  1813.                         goto out;
  1814.                 } else {
  1815.                         new_fw++;
  1816.                 }
  1817.         }
  1818.  
  1819.         snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", new_chip_name);
  1820.         err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
  1821.         if (err) {
  1822.         snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
  1823.         err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
  1824.         if (err) {
  1825.                 printk(KERN_ERR
  1826.                        "smc: error loading firmware \"%s\"\n",
  1827.                        fw_name);
  1828.                 release_firmware(rdev->smc_fw);
  1829.                 rdev->smc_fw = NULL;
  1830.                 err = 0;
  1831.         } else if (rdev->smc_fw->size != smc_req_size) {
  1832.                 printk(KERN_ERR
  1833.                        "si_smc: Bogus length %zu in firmware \"%s\"\n",
  1834.                        rdev->smc_fw->size, fw_name);
  1835.                 err = -EINVAL;
  1836.         }
  1837.         } else {
  1838.                 err = radeon_ucode_validate(rdev->smc_fw);
  1839.                 if (err) {
  1840.                         printk(KERN_ERR
  1841.                                "si_cp: validation failed for firmware \"%s\"\n",
  1842.                                fw_name);
  1843.                         goto out;
  1844.                 } else {
  1845.                         new_fw++;
  1846.                 }
  1847.         }
  1848.  
  1849.         if (new_fw == 0) {
  1850.                 rdev->new_fw = false;
  1851.         } else if (new_fw < 6) {
  1852.                 printk(KERN_ERR "si_fw: mixing new and old firmware!\n");
  1853.                 err = -EINVAL;
  1854.         } else {
  1855.                 rdev->new_fw = true;
  1856.         }
  1857. out:
  1858.         if (err) {
  1859.                 if (err != -EINVAL)
  1860.                         printk(KERN_ERR
  1861.                                "si_cp: Failed to load firmware \"%s\"\n",
  1862.                                fw_name);
  1863.                 release_firmware(rdev->pfp_fw);
  1864.                 rdev->pfp_fw = NULL;
  1865.                 release_firmware(rdev->me_fw);
  1866.                 rdev->me_fw = NULL;
  1867.                 release_firmware(rdev->ce_fw);
  1868.                 rdev->ce_fw = NULL;
  1869.                 release_firmware(rdev->rlc_fw);
  1870.                 rdev->rlc_fw = NULL;
  1871.                 release_firmware(rdev->mc_fw);
  1872.                 rdev->mc_fw = NULL;
  1873.                 release_firmware(rdev->smc_fw);
  1874.                 rdev->smc_fw = NULL;
  1875.         }
  1876.         return err;
  1877. }
  1878.  
  1879. /* watermark setup */
  1880. static u32 dce6_line_buffer_adjust(struct radeon_device *rdev,
  1881.                                    struct radeon_crtc *radeon_crtc,
  1882.                                    struct drm_display_mode *mode,
  1883.                                    struct drm_display_mode *other_mode)
  1884. {
  1885.         u32 tmp, buffer_alloc, i;
  1886.         u32 pipe_offset = radeon_crtc->crtc_id * 0x20;
  1887.         /*
  1888.          * Line Buffer Setup
  1889.          * There are 3 line buffers, each one shared by 2 display controllers.
  1890.          * DC_LB_MEMORY_SPLIT controls how that line buffer is shared between
  1891.          * the display controllers.  The paritioning is done via one of four
  1892.          * preset allocations specified in bits 21:20:
  1893.          *  0 - half lb
  1894.          *  2 - whole lb, other crtc must be disabled
  1895.          */
  1896.         /* this can get tricky if we have two large displays on a paired group
  1897.          * of crtcs.  Ideally for multiple large displays we'd assign them to
  1898.          * non-linked crtcs for maximum line buffer allocation.
  1899.          */
  1900.         if (radeon_crtc->base.enabled && mode) {
  1901.                 if (other_mode) {
  1902.                         tmp = 0; /* 1/2 */
  1903.                         buffer_alloc = 1;
  1904.                 } else {
  1905.                         tmp = 2; /* whole */
  1906.                         buffer_alloc = 2;
  1907.                 }
  1908.         } else {
  1909.                 tmp = 0;
  1910.                 buffer_alloc = 0;
  1911.         }
  1912.  
  1913.         WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset,
  1914.                DC_LB_MEMORY_CONFIG(tmp));
  1915.  
  1916.         WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset,
  1917.                DMIF_BUFFERS_ALLOCATED(buffer_alloc));
  1918.         for (i = 0; i < rdev->usec_timeout; i++) {
  1919.                 if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) &
  1920.                     DMIF_BUFFERS_ALLOCATED_COMPLETED)
  1921.                         break;
  1922.                 udelay(1);
  1923.         }
  1924.  
  1925.         if (radeon_crtc->base.enabled && mode) {
  1926.                 switch (tmp) {
  1927.                 case 0:
  1928.                 default:
  1929.                         return 4096 * 2;
  1930.                 case 2:
  1931.                         return 8192 * 2;
  1932.                 }
  1933.         }
  1934.  
  1935.         /* controller not enabled, so no lb used */
  1936.         return 0;
  1937. }
  1938.  
  1939. static u32 si_get_number_of_dram_channels(struct radeon_device *rdev)
  1940. {
  1941.         u32 tmp = RREG32(MC_SHARED_CHMAP);
  1942.  
  1943.         switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
  1944.         case 0:
  1945.         default:
  1946.                 return 1;
  1947.         case 1:
  1948.                 return 2;
  1949.         case 2:
  1950.                 return 4;
  1951.         case 3:
  1952.                 return 8;
  1953.         case 4:
  1954.                 return 3;
  1955.         case 5:
  1956.                 return 6;
  1957.         case 6:
  1958.                 return 10;
  1959.         case 7:
  1960.                 return 12;
  1961.         case 8:
  1962.                 return 16;
  1963.         }
  1964. }
  1965.  
  1966. struct dce6_wm_params {
  1967.         u32 dram_channels; /* number of dram channels */
  1968.         u32 yclk;          /* bandwidth per dram data pin in kHz */
  1969.         u32 sclk;          /* engine clock in kHz */
  1970.         u32 disp_clk;      /* display clock in kHz */
  1971.         u32 src_width;     /* viewport width */
  1972.         u32 active_time;   /* active display time in ns */
  1973.         u32 blank_time;    /* blank time in ns */
  1974.         bool interlaced;    /* mode is interlaced */
  1975.         fixed20_12 vsc;    /* vertical scale ratio */
  1976.         u32 num_heads;     /* number of active crtcs */
  1977.         u32 bytes_per_pixel; /* bytes per pixel display + overlay */
  1978.         u32 lb_size;       /* line buffer allocated to pipe */
  1979.         u32 vtaps;         /* vertical scaler taps */
  1980. };
  1981.  
  1982. static u32 dce6_dram_bandwidth(struct dce6_wm_params *wm)
  1983. {
  1984.         /* Calculate raw DRAM Bandwidth */
  1985.         fixed20_12 dram_efficiency; /* 0.7 */
  1986.         fixed20_12 yclk, dram_channels, bandwidth;
  1987.         fixed20_12 a;
  1988.  
  1989.         a.full = dfixed_const(1000);
  1990.         yclk.full = dfixed_const(wm->yclk);
  1991.         yclk.full = dfixed_div(yclk, a);
  1992.         dram_channels.full = dfixed_const(wm->dram_channels * 4);
  1993.         a.full = dfixed_const(10);
  1994.         dram_efficiency.full = dfixed_const(7);
  1995.         dram_efficiency.full = dfixed_div(dram_efficiency, a);
  1996.         bandwidth.full = dfixed_mul(dram_channels, yclk);
  1997.         bandwidth.full = dfixed_mul(bandwidth, dram_efficiency);
  1998.  
  1999.         return dfixed_trunc(bandwidth);
  2000. }
  2001.  
  2002. static u32 dce6_dram_bandwidth_for_display(struct dce6_wm_params *wm)
  2003. {
  2004.         /* Calculate DRAM Bandwidth and the part allocated to display. */
  2005.         fixed20_12 disp_dram_allocation; /* 0.3 to 0.7 */
  2006.         fixed20_12 yclk, dram_channels, bandwidth;
  2007.         fixed20_12 a;
  2008.  
  2009.         a.full = dfixed_const(1000);
  2010.         yclk.full = dfixed_const(wm->yclk);
  2011.         yclk.full = dfixed_div(yclk, a);
  2012.         dram_channels.full = dfixed_const(wm->dram_channels * 4);
  2013.         a.full = dfixed_const(10);
  2014.         disp_dram_allocation.full = dfixed_const(3); /* XXX worse case value 0.3 */
  2015.         disp_dram_allocation.full = dfixed_div(disp_dram_allocation, a);
  2016.         bandwidth.full = dfixed_mul(dram_channels, yclk);
  2017.         bandwidth.full = dfixed_mul(bandwidth, disp_dram_allocation);
  2018.  
  2019.         return dfixed_trunc(bandwidth);
  2020. }
  2021.  
  2022. static u32 dce6_data_return_bandwidth(struct dce6_wm_params *wm)
  2023. {
  2024.         /* Calculate the display Data return Bandwidth */
  2025.         fixed20_12 return_efficiency; /* 0.8 */
  2026.         fixed20_12 sclk, bandwidth;
  2027.         fixed20_12 a;
  2028.  
  2029.         a.full = dfixed_const(1000);
  2030.         sclk.full = dfixed_const(wm->sclk);
  2031.         sclk.full = dfixed_div(sclk, a);
  2032.         a.full = dfixed_const(10);
  2033.         return_efficiency.full = dfixed_const(8);
  2034.         return_efficiency.full = dfixed_div(return_efficiency, a);
  2035.         a.full = dfixed_const(32);
  2036.         bandwidth.full = dfixed_mul(a, sclk);
  2037.         bandwidth.full = dfixed_mul(bandwidth, return_efficiency);
  2038.  
  2039.         return dfixed_trunc(bandwidth);
  2040. }
  2041.  
  2042. static u32 dce6_get_dmif_bytes_per_request(struct dce6_wm_params *wm)
  2043. {
  2044.         return 32;
  2045. }
  2046.  
  2047. static u32 dce6_dmif_request_bandwidth(struct dce6_wm_params *wm)
  2048. {
  2049.         /* Calculate the DMIF Request Bandwidth */
  2050.         fixed20_12 disp_clk_request_efficiency; /* 0.8 */
  2051.         fixed20_12 disp_clk, sclk, bandwidth;
  2052.         fixed20_12 a, b1, b2;
  2053.         u32 min_bandwidth;
  2054.  
  2055.         a.full = dfixed_const(1000);
  2056.         disp_clk.full = dfixed_const(wm->disp_clk);
  2057.         disp_clk.full = dfixed_div(disp_clk, a);
  2058.         a.full = dfixed_const(dce6_get_dmif_bytes_per_request(wm) / 2);
  2059.         b1.full = dfixed_mul(a, disp_clk);
  2060.  
  2061.         a.full = dfixed_const(1000);
  2062.         sclk.full = dfixed_const(wm->sclk);
  2063.         sclk.full = dfixed_div(sclk, a);
  2064.         a.full = dfixed_const(dce6_get_dmif_bytes_per_request(wm));
  2065.         b2.full = dfixed_mul(a, sclk);
  2066.  
  2067.         a.full = dfixed_const(10);
  2068.         disp_clk_request_efficiency.full = dfixed_const(8);
  2069.         disp_clk_request_efficiency.full = dfixed_div(disp_clk_request_efficiency, a);
  2070.  
  2071.         min_bandwidth = min(dfixed_trunc(b1), dfixed_trunc(b2));
  2072.  
  2073.         a.full = dfixed_const(min_bandwidth);
  2074.         bandwidth.full = dfixed_mul(a, disp_clk_request_efficiency);
  2075.  
  2076.         return dfixed_trunc(bandwidth);
  2077. }
  2078.  
  2079. static u32 dce6_available_bandwidth(struct dce6_wm_params *wm)
  2080. {
  2081.         /* Calculate the Available bandwidth. Display can use this temporarily but not in average. */
  2082.         u32 dram_bandwidth = dce6_dram_bandwidth(wm);
  2083.         u32 data_return_bandwidth = dce6_data_return_bandwidth(wm);
  2084.         u32 dmif_req_bandwidth = dce6_dmif_request_bandwidth(wm);
  2085.  
  2086.         return min(dram_bandwidth, min(data_return_bandwidth, dmif_req_bandwidth));
  2087. }
  2088.  
  2089. static u32 dce6_average_bandwidth(struct dce6_wm_params *wm)
  2090. {
  2091.         /* Calculate the display mode Average Bandwidth
  2092.          * DisplayMode should contain the source and destination dimensions,
  2093.          * timing, etc.
  2094.          */
  2095.         fixed20_12 bpp;
  2096.         fixed20_12 line_time;
  2097.         fixed20_12 src_width;
  2098.         fixed20_12 bandwidth;
  2099.         fixed20_12 a;
  2100.  
  2101.         a.full = dfixed_const(1000);
  2102.         line_time.full = dfixed_const(wm->active_time + wm->blank_time);
  2103.         line_time.full = dfixed_div(line_time, a);
  2104.         bpp.full = dfixed_const(wm->bytes_per_pixel);
  2105.         src_width.full = dfixed_const(wm->src_width);
  2106.         bandwidth.full = dfixed_mul(src_width, bpp);
  2107.         bandwidth.full = dfixed_mul(bandwidth, wm->vsc);
  2108.         bandwidth.full = dfixed_div(bandwidth, line_time);
  2109.  
  2110.         return dfixed_trunc(bandwidth);
  2111. }
  2112.  
  2113. static u32 dce6_latency_watermark(struct dce6_wm_params *wm)
  2114. {
  2115.         /* First calcualte the latency in ns */
  2116.         u32 mc_latency = 2000; /* 2000 ns. */
  2117.         u32 available_bandwidth = dce6_available_bandwidth(wm);
  2118.         u32 worst_chunk_return_time = (512 * 8 * 1000) / available_bandwidth;
  2119.         u32 cursor_line_pair_return_time = (128 * 4 * 1000) / available_bandwidth;
  2120.         u32 dc_latency = 40000000 / wm->disp_clk; /* dc pipe latency */
  2121.         u32 other_heads_data_return_time = ((wm->num_heads + 1) * worst_chunk_return_time) +
  2122.                 (wm->num_heads * cursor_line_pair_return_time);
  2123.         u32 latency = mc_latency + other_heads_data_return_time + dc_latency;
  2124.         u32 max_src_lines_per_dst_line, lb_fill_bw, line_fill_time;
  2125.         u32 tmp, dmif_size = 12288;
  2126.         fixed20_12 a, b, c;
  2127.  
  2128.         if (wm->num_heads == 0)
  2129.                 return 0;
  2130.  
  2131.         a.full = dfixed_const(2);
  2132.         b.full = dfixed_const(1);
  2133.         if ((wm->vsc.full > a.full) ||
  2134.             ((wm->vsc.full > b.full) && (wm->vtaps >= 3)) ||
  2135.             (wm->vtaps >= 5) ||
  2136.             ((wm->vsc.full >= a.full) && wm->interlaced))
  2137.                 max_src_lines_per_dst_line = 4;
  2138.         else
  2139.                 max_src_lines_per_dst_line = 2;
  2140.  
  2141.         a.full = dfixed_const(available_bandwidth);
  2142.         b.full = dfixed_const(wm->num_heads);
  2143.         a.full = dfixed_div(a, b);
  2144.  
  2145.         b.full = dfixed_const(mc_latency + 512);
  2146.         c.full = dfixed_const(wm->disp_clk);
  2147.         b.full = dfixed_div(b, c);
  2148.  
  2149.         c.full = dfixed_const(dmif_size);
  2150.         b.full = dfixed_div(c, b);
  2151.  
  2152.         tmp = min(dfixed_trunc(a), dfixed_trunc(b));
  2153.  
  2154.         b.full = dfixed_const(1000);
  2155.         c.full = dfixed_const(wm->disp_clk);
  2156.         b.full = dfixed_div(c, b);
  2157.         c.full = dfixed_const(wm->bytes_per_pixel);
  2158.         b.full = dfixed_mul(b, c);
  2159.  
  2160.         lb_fill_bw = min(tmp, dfixed_trunc(b));
  2161.  
  2162.         a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
  2163.         b.full = dfixed_const(1000);
  2164.         c.full = dfixed_const(lb_fill_bw);
  2165.         b.full = dfixed_div(c, b);
  2166.         a.full = dfixed_div(a, b);
  2167.         line_fill_time = dfixed_trunc(a);
  2168.  
  2169.         if (line_fill_time < wm->active_time)
  2170.                 return latency;
  2171.         else
  2172.                 return latency + (line_fill_time - wm->active_time);
  2173.  
  2174. }
  2175.  
  2176. static bool dce6_average_bandwidth_vs_dram_bandwidth_for_display(struct dce6_wm_params *wm)
  2177. {
  2178.         if (dce6_average_bandwidth(wm) <=
  2179.             (dce6_dram_bandwidth_for_display(wm) / wm->num_heads))
  2180.                 return true;
  2181.         else
  2182.                 return false;
  2183. };
  2184.  
  2185. static bool dce6_average_bandwidth_vs_available_bandwidth(struct dce6_wm_params *wm)
  2186. {
  2187.         if (dce6_average_bandwidth(wm) <=
  2188.             (dce6_available_bandwidth(wm) / wm->num_heads))
  2189.                 return true;
  2190.         else
  2191.                 return false;
  2192. };
  2193.  
  2194. static bool dce6_check_latency_hiding(struct dce6_wm_params *wm)
  2195. {
  2196.         u32 lb_partitions = wm->lb_size / wm->src_width;
  2197.         u32 line_time = wm->active_time + wm->blank_time;
  2198.         u32 latency_tolerant_lines;
  2199.         u32 latency_hiding;
  2200.         fixed20_12 a;
  2201.  
  2202.         a.full = dfixed_const(1);
  2203.         if (wm->vsc.full > a.full)
  2204.                 latency_tolerant_lines = 1;
  2205.         else {
  2206.                 if (lb_partitions <= (wm->vtaps + 1))
  2207.                         latency_tolerant_lines = 1;
  2208.                 else
  2209.                         latency_tolerant_lines = 2;
  2210.         }
  2211.  
  2212.         latency_hiding = (latency_tolerant_lines * line_time + wm->blank_time);
  2213.  
  2214.         if (dce6_latency_watermark(wm) <= latency_hiding)
  2215.                 return true;
  2216.         else
  2217.                 return false;
  2218. }
  2219.  
  2220. static void dce6_program_watermarks(struct radeon_device *rdev,
  2221.                                          struct radeon_crtc *radeon_crtc,
  2222.                                          u32 lb_size, u32 num_heads)
  2223. {
  2224.         struct drm_display_mode *mode = &radeon_crtc->base.mode;
  2225.         struct dce6_wm_params wm_low, wm_high;
  2226.         u32 dram_channels;
  2227.         u32 pixel_period;
  2228.         u32 line_time = 0;
  2229.         u32 latency_watermark_a = 0, latency_watermark_b = 0;
  2230.         u32 priority_a_mark = 0, priority_b_mark = 0;
  2231.         u32 priority_a_cnt = PRIORITY_OFF;
  2232.         u32 priority_b_cnt = PRIORITY_OFF;
  2233.         u32 tmp, arb_control3;
  2234.         fixed20_12 a, b, c;
  2235.  
  2236.         if (radeon_crtc->base.enabled && num_heads && mode) {
  2237.                 pixel_period = 1000000 / (u32)mode->clock;
  2238.                 line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535);
  2239.                 priority_a_cnt = 0;
  2240.                 priority_b_cnt = 0;
  2241.  
  2242.                 if (rdev->family == CHIP_ARUBA)
  2243.                         dram_channels = evergreen_get_number_of_dram_channels(rdev);
  2244.                 else
  2245.                         dram_channels = si_get_number_of_dram_channels(rdev);
  2246.  
  2247.                 /* watermark for high clocks */
  2248.                 if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
  2249.                         wm_high.yclk =
  2250.                                 radeon_dpm_get_mclk(rdev, false) * 10;
  2251.                         wm_high.sclk =
  2252.                                 radeon_dpm_get_sclk(rdev, false) * 10;
  2253.                 } else {
  2254.                         wm_high.yclk = rdev->pm.current_mclk * 10;
  2255.                         wm_high.sclk = rdev->pm.current_sclk * 10;
  2256.                 }
  2257.  
  2258.                 wm_high.disp_clk = mode->clock;
  2259.                 wm_high.src_width = mode->crtc_hdisplay;
  2260.                 wm_high.active_time = mode->crtc_hdisplay * pixel_period;
  2261.                 wm_high.blank_time = line_time - wm_high.active_time;
  2262.                 wm_high.interlaced = false;
  2263.                 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
  2264.                         wm_high.interlaced = true;
  2265.                 wm_high.vsc = radeon_crtc->vsc;
  2266.                 wm_high.vtaps = 1;
  2267.                 if (radeon_crtc->rmx_type != RMX_OFF)
  2268.                         wm_high.vtaps = 2;
  2269.                 wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */
  2270.                 wm_high.lb_size = lb_size;
  2271.                 wm_high.dram_channels = dram_channels;
  2272.                 wm_high.num_heads = num_heads;
  2273.  
  2274.                 /* watermark for low clocks */
  2275.                 if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
  2276.                         wm_low.yclk =
  2277.                                 radeon_dpm_get_mclk(rdev, true) * 10;
  2278.                         wm_low.sclk =
  2279.                                 radeon_dpm_get_sclk(rdev, true) * 10;
  2280.                 } else {
  2281.                         wm_low.yclk = rdev->pm.current_mclk * 10;
  2282.                         wm_low.sclk = rdev->pm.current_sclk * 10;
  2283.                 }
  2284.  
  2285.                 wm_low.disp_clk = mode->clock;
  2286.                 wm_low.src_width = mode->crtc_hdisplay;
  2287.                 wm_low.active_time = mode->crtc_hdisplay * pixel_period;
  2288.                 wm_low.blank_time = line_time - wm_low.active_time;
  2289.                 wm_low.interlaced = false;
  2290.                 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
  2291.                         wm_low.interlaced = true;
  2292.                 wm_low.vsc = radeon_crtc->vsc;
  2293.                 wm_low.vtaps = 1;
  2294.                 if (radeon_crtc->rmx_type != RMX_OFF)
  2295.                         wm_low.vtaps = 2;
  2296.                 wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */
  2297.                 wm_low.lb_size = lb_size;
  2298.                 wm_low.dram_channels = dram_channels;
  2299.                 wm_low.num_heads = num_heads;
  2300.  
  2301.                 /* set for high clocks */
  2302.                 latency_watermark_a = min(dce6_latency_watermark(&wm_high), (u32)65535);
  2303.                 /* set for low clocks */
  2304.                 latency_watermark_b = min(dce6_latency_watermark(&wm_low), (u32)65535);
  2305.  
  2306.                 /* possibly force display priority to high */
  2307.                 /* should really do this at mode validation time... */
  2308.                 if (!dce6_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) ||
  2309.                     !dce6_average_bandwidth_vs_available_bandwidth(&wm_high) ||
  2310.                     !dce6_check_latency_hiding(&wm_high) ||
  2311.                     (rdev->disp_priority == 2)) {
  2312.                         DRM_DEBUG_KMS("force priority to high\n");
  2313.                         priority_a_cnt |= PRIORITY_ALWAYS_ON;
  2314.                         priority_b_cnt |= PRIORITY_ALWAYS_ON;
  2315.                 }
  2316.                 if (!dce6_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) ||
  2317.                     !dce6_average_bandwidth_vs_available_bandwidth(&wm_low) ||
  2318.                     !dce6_check_latency_hiding(&wm_low) ||
  2319.                     (rdev->disp_priority == 2)) {
  2320.                         DRM_DEBUG_KMS("force priority to high\n");
  2321.                         priority_a_cnt |= PRIORITY_ALWAYS_ON;
  2322.                         priority_b_cnt |= PRIORITY_ALWAYS_ON;
  2323.                 }
  2324.  
  2325.                 a.full = dfixed_const(1000);
  2326.                 b.full = dfixed_const(mode->clock);
  2327.                 b.full = dfixed_div(b, a);
  2328.                 c.full = dfixed_const(latency_watermark_a);
  2329.                 c.full = dfixed_mul(c, b);
  2330.                 c.full = dfixed_mul(c, radeon_crtc->hsc);
  2331.                 c.full = dfixed_div(c, a);
  2332.                 a.full = dfixed_const(16);
  2333.                 c.full = dfixed_div(c, a);
  2334.                 priority_a_mark = dfixed_trunc(c);
  2335.                 priority_a_cnt |= priority_a_mark & PRIORITY_MARK_MASK;
  2336.  
  2337.                 a.full = dfixed_const(1000);
  2338.                 b.full = dfixed_const(mode->clock);
  2339.                 b.full = dfixed_div(b, a);
  2340.                 c.full = dfixed_const(latency_watermark_b);
  2341.                 c.full = dfixed_mul(c, b);
  2342.                 c.full = dfixed_mul(c, radeon_crtc->hsc);
  2343.                 c.full = dfixed_div(c, a);
  2344.                 a.full = dfixed_const(16);
  2345.                 c.full = dfixed_div(c, a);
  2346.                 priority_b_mark = dfixed_trunc(c);
  2347.                 priority_b_cnt |= priority_b_mark & PRIORITY_MARK_MASK;
  2348.         }
  2349.  
  2350.         /* select wm A */
  2351.         arb_control3 = RREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset);
  2352.         tmp = arb_control3;
  2353.         tmp &= ~LATENCY_WATERMARK_MASK(3);
  2354.         tmp |= LATENCY_WATERMARK_MASK(1);
  2355.         WREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset, tmp);
  2356.         WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
  2357.                (LATENCY_LOW_WATERMARK(latency_watermark_a) |
  2358.                 LATENCY_HIGH_WATERMARK(line_time)));
  2359.         /* select wm B */
  2360.         tmp = RREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset);
  2361.         tmp &= ~LATENCY_WATERMARK_MASK(3);
  2362.         tmp |= LATENCY_WATERMARK_MASK(2);
  2363.         WREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset, tmp);
  2364.         WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
  2365.                (LATENCY_LOW_WATERMARK(latency_watermark_b) |
  2366.                 LATENCY_HIGH_WATERMARK(line_time)));
  2367.         /* restore original selection */
  2368.         WREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset, arb_control3);
  2369.  
  2370.         /* write the priority marks */
  2371.         WREG32(PRIORITY_A_CNT + radeon_crtc->crtc_offset, priority_a_cnt);
  2372.         WREG32(PRIORITY_B_CNT + radeon_crtc->crtc_offset, priority_b_cnt);
  2373.  
  2374.         /* save values for DPM */
  2375.         radeon_crtc->line_time = line_time;
  2376.         radeon_crtc->wm_high = latency_watermark_a;
  2377.         radeon_crtc->wm_low = latency_watermark_b;
  2378. }
  2379.  
  2380. void dce6_bandwidth_update(struct radeon_device *rdev)
  2381. {
  2382.         struct drm_display_mode *mode0 = NULL;
  2383.         struct drm_display_mode *mode1 = NULL;
  2384.         u32 num_heads = 0, lb_size;
  2385.         int i;
  2386.  
  2387.         radeon_update_display_priority(rdev);
  2388.  
  2389.         for (i = 0; i < rdev->num_crtc; i++) {
  2390.                 if (rdev->mode_info.crtcs[i]->base.enabled)
  2391.                         num_heads++;
  2392.         }
  2393.         for (i = 0; i < rdev->num_crtc; i += 2) {
  2394.                 mode0 = &rdev->mode_info.crtcs[i]->base.mode;
  2395.                 mode1 = &rdev->mode_info.crtcs[i+1]