Subversion Repositories Kolibri OS

Rev

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

  1. /*
  2.  * Copyright © 2014 Intel Corporation
  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 (including the next
  12.  * paragraph) shall be included in all copies or substantial portions of the
  13.  * Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  21.  * IN THE SOFTWARE.
  22.  */
  23. #ifndef _INTEL_GUC_FWIF_H
  24. #define _INTEL_GUC_FWIF_H
  25.  
  26. /*
  27.  * This file is partially autogenerated, although currently with some manual
  28.  * fixups afterwards. In future, it should be entirely autogenerated, in order
  29.  * to ensure that the definitions herein remain in sync with those used by the
  30.  * GuC's own firmware.
  31.  *
  32.  * EDITING THIS FILE IS THEREFORE NOT RECOMMENDED - YOUR CHANGES MAY BE LOST.
  33.  */
  34.  
  35. #define GFXCORE_FAMILY_GEN9             12
  36. #define GFXCORE_FAMILY_UNKNOWN          0x7fffffff
  37.  
  38. #define GUC_CTX_PRIORITY_KMD_HIGH       0
  39. #define GUC_CTX_PRIORITY_HIGH           1
  40. #define GUC_CTX_PRIORITY_KMD_NORMAL     2
  41. #define GUC_CTX_PRIORITY_NORMAL         3
  42.  
  43. #define GUC_MAX_GPU_CONTEXTS            1024
  44. #define GUC_INVALID_CTX_ID              GUC_MAX_GPU_CONTEXTS
  45.  
  46. /* Work queue item header definitions */
  47. #define WQ_STATUS_ACTIVE                1
  48. #define WQ_STATUS_SUSPENDED             2
  49. #define WQ_STATUS_CMD_ERROR             3
  50. #define WQ_STATUS_ENGINE_ID_NOT_USED    4
  51. #define WQ_STATUS_SUSPENDED_FROM_RESET  5
  52. #define WQ_TYPE_SHIFT                   0
  53. #define   WQ_TYPE_BATCH_BUF             (0x1 << WQ_TYPE_SHIFT)
  54. #define   WQ_TYPE_PSEUDO                (0x2 << WQ_TYPE_SHIFT)
  55. #define   WQ_TYPE_INORDER               (0x3 << WQ_TYPE_SHIFT)
  56. #define WQ_TARGET_SHIFT                 10
  57. #define WQ_LEN_SHIFT                    16
  58. #define WQ_NO_WCFLUSH_WAIT              (1 << 27)
  59. #define WQ_PRESENT_WORKLOAD             (1 << 28)
  60. #define WQ_WORKLOAD_SHIFT               29
  61. #define   WQ_WORKLOAD_GENERAL           (0 << WQ_WORKLOAD_SHIFT)
  62. #define   WQ_WORKLOAD_GPGPU             (1 << WQ_WORKLOAD_SHIFT)
  63. #define   WQ_WORKLOAD_TOUCH             (2 << WQ_WORKLOAD_SHIFT)
  64.  
  65. #define WQ_RING_TAIL_SHIFT              20
  66. #define WQ_RING_TAIL_MASK               (0x7FF << WQ_RING_TAIL_SHIFT)
  67.  
  68. #define GUC_DOORBELL_ENABLED            1
  69. #define GUC_DOORBELL_DISABLED           0
  70.  
  71. #define GUC_CTX_DESC_ATTR_ACTIVE        (1 << 0)
  72. #define GUC_CTX_DESC_ATTR_PENDING_DB    (1 << 1)
  73. #define GUC_CTX_DESC_ATTR_KERNEL        (1 << 2)
  74. #define GUC_CTX_DESC_ATTR_PREEMPT       (1 << 3)
  75. #define GUC_CTX_DESC_ATTR_RESET         (1 << 4)
  76. #define GUC_CTX_DESC_ATTR_WQLOCKED      (1 << 5)
  77. #define GUC_CTX_DESC_ATTR_PCH           (1 << 6)
  78. #define GUC_CTX_DESC_ATTR_TERMINATED    (1 << 7)
  79.  
  80. /* The guc control data is 10 DWORDs */
  81. #define GUC_CTL_CTXINFO                 0
  82. #define   GUC_CTL_CTXNUM_IN16_SHIFT     0
  83. #define   GUC_CTL_BASE_ADDR_SHIFT       12
  84. #define GUC_CTL_ARAT_HIGH               1
  85. #define GUC_CTL_ARAT_LOW                2
  86. #define GUC_CTL_DEVICE_INFO             3
  87. #define   GUC_CTL_GTTYPE_SHIFT          0
  88. #define   GUC_CTL_COREFAMILY_SHIFT      7
  89. #define GUC_CTL_LOG_PARAMS              4
  90. #define   GUC_LOG_VALID                 (1 << 0)
  91. #define   GUC_LOG_NOTIFY_ON_HALF_FULL   (1 << 1)
  92. #define   GUC_LOG_ALLOC_IN_MEGABYTE     (1 << 3)
  93. #define   GUC_LOG_CRASH_PAGES           1
  94. #define   GUC_LOG_CRASH_SHIFT           4
  95. #define   GUC_LOG_DPC_PAGES             3
  96. #define   GUC_LOG_DPC_SHIFT             6
  97. #define   GUC_LOG_ISR_PAGES             3
  98. #define   GUC_LOG_ISR_SHIFT             9
  99. #define   GUC_LOG_BUF_ADDR_SHIFT        12
  100. #define GUC_CTL_PAGE_FAULT_CONTROL      5
  101. #define GUC_CTL_WA                      6
  102. #define   GUC_CTL_WA_UK_BY_DRIVER       (1 << 3)
  103. #define GUC_CTL_FEATURE                 7
  104. #define   GUC_CTL_VCS2_ENABLED          (1 << 0)
  105. #define   GUC_CTL_KERNEL_SUBMISSIONS    (1 << 1)
  106. #define   GUC_CTL_FEATURE2              (1 << 2)
  107. #define   GUC_CTL_POWER_GATING          (1 << 3)
  108. #define   GUC_CTL_DISABLE_SCHEDULER     (1 << 4)
  109. #define   GUC_CTL_PREEMPTION_LOG        (1 << 5)
  110. #define   GUC_CTL_ENABLE_SLPC           (1 << 7)
  111. #define   GUC_CTL_RESET_ON_PREMPT_FAILURE       (1 << 8)
  112. #define GUC_CTL_DEBUG                   8
  113. #define   GUC_LOG_VERBOSITY_SHIFT       0
  114. #define   GUC_LOG_VERBOSITY_LOW         (0 << GUC_LOG_VERBOSITY_SHIFT)
  115. #define   GUC_LOG_VERBOSITY_MED         (1 << GUC_LOG_VERBOSITY_SHIFT)
  116. #define   GUC_LOG_VERBOSITY_HIGH        (2 << GUC_LOG_VERBOSITY_SHIFT)
  117. #define   GUC_LOG_VERBOSITY_ULTRA       (3 << GUC_LOG_VERBOSITY_SHIFT)
  118. /* Verbosity range-check limits, without the shift */
  119. #define   GUC_LOG_VERBOSITY_MIN         0
  120. #define   GUC_LOG_VERBOSITY_MAX         3
  121. #define GUC_CTL_RSRVD                   9
  122.  
  123. #define GUC_CTL_MAX_DWORDS              (GUC_CTL_RSRVD + 1)
  124.  
  125. /**
  126.  * DOC: GuC Firmware Layout
  127.  *
  128.  * The GuC firmware layout looks like this:
  129.  *
  130.  *     +-------------------------------+
  131.  *     |        guc_css_header         |
  132.  *     | contains major/minor version  |
  133.  *     +-------------------------------+
  134.  *     |             uCode             |
  135.  *     +-------------------------------+
  136.  *     |         RSA signature         |
  137.  *     +-------------------------------+
  138.  *     |          modulus key          |
  139.  *     +-------------------------------+
  140.  *     |          exponent val         |
  141.  *     +-------------------------------+
  142.  *
  143.  * The firmware may or may not have modulus key and exponent data. The header,
  144.  * uCode and RSA signature are must-have components that will be used by driver.
  145.  * Length of each components, which is all in dwords, can be found in header.
  146.  * In the case that modulus and exponent are not present in fw, a.k.a truncated
  147.  * image, the length value still appears in header.
  148.  *
  149.  * Driver will do some basic fw size validation based on the following rules:
  150.  *
  151.  * 1. Header, uCode and RSA are must-have components.
  152.  * 2. All firmware components, if they present, are in the sequence illustrated
  153.  * in the layout table above.
  154.  * 3. Length info of each component can be found in header, in dwords.
  155.  * 4. Modulus and exponent key are not required by driver. They may not appear
  156.  * in fw. So driver will load a truncated firmware in this case.
  157.  */
  158.  
  159. struct guc_css_header {
  160.         uint32_t module_type;
  161.         /* header_size includes all non-uCode bits, including css_header, rsa
  162.          * key, modulus key and exponent data. */
  163.         uint32_t header_size_dw;
  164.         uint32_t header_version;
  165.         uint32_t module_id;
  166.         uint32_t module_vendor;
  167.         union {
  168.                 struct {
  169.                         uint8_t day;
  170.                         uint8_t month;
  171.                         uint16_t year;
  172.                 };
  173.                 uint32_t date;
  174.         };
  175.         uint32_t size_dw; /* uCode plus header_size_dw */
  176.         uint32_t key_size_dw;
  177.         uint32_t modulus_size_dw;
  178.         uint32_t exponent_size_dw;
  179.         union {
  180.                 struct {
  181.                         uint8_t hour;
  182.                         uint8_t min;
  183.                         uint16_t sec;
  184.                 };
  185.                 uint32_t time;
  186.         };
  187.  
  188.         char username[8];
  189.         char buildnumber[12];
  190.         uint32_t device_id;
  191.         uint32_t guc_sw_version;
  192.         uint32_t prod_preprod_fw;
  193.         uint32_t reserved[12];
  194.         uint32_t header_info;
  195. } __packed;
  196.  
  197. struct guc_doorbell_info {
  198.         u32 db_status;
  199.         u32 cookie;
  200.         u32 reserved[14];
  201. } __packed;
  202.  
  203. union guc_doorbell_qw {
  204.         struct {
  205.                 u32 db_status;
  206.                 u32 cookie;
  207.         };
  208.         u64 value_qw;
  209. } __packed;
  210.  
  211. #define GUC_MAX_DOORBELLS               256
  212. #define GUC_INVALID_DOORBELL_ID         (GUC_MAX_DOORBELLS)
  213.  
  214. #define GUC_DB_SIZE                     (PAGE_SIZE)
  215. #define GUC_WQ_SIZE                     (PAGE_SIZE * 2)
  216.  
  217. /* Work item for submitting workloads into work queue of GuC. */
  218. struct guc_wq_item {
  219.         u32 header;
  220.         u32 context_desc;
  221.         u32 ring_tail;
  222.         u32 fence_id;
  223. } __packed;
  224.  
  225. struct guc_process_desc {
  226.         u32 context_id;
  227.         u64 db_base_addr;
  228.         u32 head;
  229.         u32 tail;
  230.         u32 error_offset;
  231.         u64 wq_base_addr;
  232.         u32 wq_size_bytes;
  233.         u32 wq_status;
  234.         u32 engine_presence;
  235.         u32 priority;
  236.         u32 reserved[30];
  237. } __packed;
  238.  
  239. /* engine id and context id is packed into guc_execlist_context.context_id*/
  240. #define GUC_ELC_CTXID_OFFSET            0
  241. #define GUC_ELC_ENGINE_OFFSET           29
  242.  
  243. /* The execlist context including software and HW information */
  244. struct guc_execlist_context {
  245.         u32 context_desc;
  246.         u32 context_id;
  247.         u32 ring_status;
  248.         u32 ring_lcra;
  249.         u32 ring_begin;
  250.         u32 ring_end;
  251.         u32 ring_next_free_location;
  252.         u32 ring_current_tail_pointer_value;
  253.         u8 engine_state_submit_value;
  254.         u8 engine_state_wait_value;
  255.         u16 pagefault_count;
  256.         u16 engine_submit_queue_count;
  257. } __packed;
  258.  
  259. /*Context descriptor for communicating between uKernel and Driver*/
  260. struct guc_context_desc {
  261.         u32 sched_common_area;
  262.         u32 context_id;
  263.         u32 pas_id;
  264.         u8 engines_used;
  265.         u64 db_trigger_cpu;
  266.         u32 db_trigger_uk;
  267.         u64 db_trigger_phy;
  268.         u16 db_id;
  269.  
  270.         struct guc_execlist_context lrc[I915_NUM_RINGS];
  271.  
  272.         u8 attribute;
  273.  
  274.         u32 priority;
  275.  
  276.         u32 wq_sampled_tail_offset;
  277.         u32 wq_total_submit_enqueues;
  278.  
  279.         u32 process_desc;
  280.         u32 wq_addr;
  281.         u32 wq_size;
  282.  
  283.         u32 engine_presence;
  284.  
  285.         u8 engine_suspended;
  286.  
  287.         u8 reserved0[3];
  288.         u64 reserved1[1];
  289.  
  290.         u64 desc_private;
  291. } __packed;
  292.  
  293. #define GUC_FORCEWAKE_RENDER    (1 << 0)
  294. #define GUC_FORCEWAKE_MEDIA     (1 << 1)
  295.  
  296. #define GUC_POWER_UNSPECIFIED   0
  297. #define GUC_POWER_D0            1
  298. #define GUC_POWER_D1            2
  299. #define GUC_POWER_D2            3
  300. #define GUC_POWER_D3            4
  301.  
  302. /* This Action will be programmed in C180 - SOFT_SCRATCH_O_REG */
  303. enum host2guc_action {
  304.         HOST2GUC_ACTION_DEFAULT = 0x0,
  305.         HOST2GUC_ACTION_SAMPLE_FORCEWAKE = 0x6,
  306.         HOST2GUC_ACTION_ALLOCATE_DOORBELL = 0x10,
  307.         HOST2GUC_ACTION_DEALLOCATE_DOORBELL = 0x20,
  308.         HOST2GUC_ACTION_ENTER_S_STATE = 0x501,
  309.         HOST2GUC_ACTION_EXIT_S_STATE = 0x502,
  310.         HOST2GUC_ACTION_SLPC_REQUEST = 0x3003,
  311.         HOST2GUC_ACTION_LIMIT
  312. };
  313.  
  314. /*
  315.  * The GuC sends its response to a command by overwriting the
  316.  * command in SS0. The response is distinguishable from a command
  317.  * by the fact that all the MASK bits are set. The remaining bits
  318.  * give more detail.
  319.  */
  320. #define GUC2HOST_RESPONSE_MASK          ((u32)0xF0000000)
  321. #define GUC2HOST_IS_RESPONSE(x)         ((u32)(x) >= GUC2HOST_RESPONSE_MASK)
  322. #define GUC2HOST_STATUS(x)              (GUC2HOST_RESPONSE_MASK | (x))
  323.  
  324. /* GUC will return status back to SOFT_SCRATCH_O_REG */
  325. enum guc2host_status {
  326.         GUC2HOST_STATUS_SUCCESS = GUC2HOST_STATUS(0x0),
  327.         GUC2HOST_STATUS_ALLOCATE_DOORBELL_FAIL = GUC2HOST_STATUS(0x10),
  328.         GUC2HOST_STATUS_DEALLOCATE_DOORBELL_FAIL = GUC2HOST_STATUS(0x20),
  329.         GUC2HOST_STATUS_GENERIC_FAIL = GUC2HOST_STATUS(0x0000F000)
  330. };
  331.  
  332. #endif
  333.