1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#ifndef __DAL_DCHUBBUB_H__
27#define __DAL_DCHUBBUB_H__
28
29
30enum dcc_control {
31 dcc_control__256_256_xxx,
32 dcc_control__128_128_xxx,
33 dcc_control__256_64_64,
34 dcc_control__256_128_128,
35};
36
37enum segment_order {
38 segment_order__na,
39 segment_order__contiguous,
40 segment_order__non_contiguous,
41};
42
43struct dcn_hubbub_wm_set {
44 uint32_t wm_set;
45 uint32_t data_urgent;
46 uint32_t pte_meta_urgent;
47 uint32_t sr_enter;
48 uint32_t sr_exit;
49 uint32_t dram_clk_chanage;
50};
51
52struct dcn_hubbub_wm {
53 struct dcn_hubbub_wm_set sets[4];
54};
55
56enum dcn_hubbub_page_table_depth {
57 DCN_PAGE_TABLE_DEPTH_1_LEVEL,
58 DCN_PAGE_TABLE_DEPTH_2_LEVEL,
59 DCN_PAGE_TABLE_DEPTH_3_LEVEL,
60 DCN_PAGE_TABLE_DEPTH_4_LEVEL
61};
62
63enum dcn_hubbub_page_table_block_size {
64 DCN_PAGE_TABLE_BLOCK_SIZE_4KB = 0,
65 DCN_PAGE_TABLE_BLOCK_SIZE_64KB = 4,
66 DCN_PAGE_TABLE_BLOCK_SIZE_32KB = 3
67};
68
69struct dcn_hubbub_phys_addr_config {
70 struct {
71 uint64_t fb_top;
72 uint64_t fb_offset;
73 uint64_t fb_base;
74 uint64_t agp_top;
75 uint64_t agp_bot;
76 uint64_t agp_base;
77 } system_aperture;
78
79 struct {
80 uint64_t page_table_start_addr;
81 uint64_t page_table_end_addr;
82 uint64_t page_table_base_addr;
83 } gart_config;
84
85 uint64_t page_table_default_page_addr;
86};
87
88struct dcn_hubbub_virt_addr_config {
89 uint64_t page_table_start_addr;
90 uint64_t page_table_end_addr;
91 enum dcn_hubbub_page_table_block_size page_table_block_size;
92 enum dcn_hubbub_page_table_depth page_table_depth;
93 uint64_t page_table_base_addr;
94};
95
96struct hubbub_addr_config {
97 struct dcn_hubbub_phys_addr_config pa_config;
98 struct dcn_hubbub_virt_addr_config va_config;
99 struct {
100 uint64_t aperture_check_fault;
101 uint64_t generic_fault;
102 } default_addrs;
103};
104
105struct hubbub_funcs {
106 void (*update_dchub)(
107 struct hubbub *hubbub,
108 struct dchub_init_data *dh_data);
109
110 int (*init_dchub_sys_ctx)(
111 struct hubbub *hubbub,
112 struct dcn_hubbub_phys_addr_config *pa_config);
113 void (*init_vm_ctx)(
114 struct hubbub *hubbub,
115 struct dcn_hubbub_virt_addr_config *va_config,
116 int vmid);
117
118 bool (*get_dcc_compression_cap)(struct hubbub *hubbub,
119 const struct dc_dcc_surface_param *input,
120 struct dc_surface_dcc_cap *output);
121
122 bool (*dcc_support_swizzle)(
123 enum swizzle_mode_values swizzle,
124 unsigned int bytes_per_element,
125 enum segment_order *segment_order_horz,
126 enum segment_order *segment_order_vert);
127
128 bool (*dcc_support_pixel_format)(
129 enum surface_pixel_format format,
130 unsigned int *bytes_per_element);
131
132 void (*wm_read_state)(struct hubbub *hubbub,
133 struct dcn_hubbub_wm *wm);
134
135 void (*get_dchub_ref_freq)(struct hubbub *hubbub,
136 unsigned int dccg_ref_freq_inKhz,
137 unsigned int *dchub_ref_freq_inKhz);
138
139 bool (*program_watermarks)(
140 struct hubbub *hubbub,
141 struct dcn_watermark_set *watermarks,
142 unsigned int refclk_mhz,
143 bool safe_to_lower);
144
145 bool (*is_allow_self_refresh_enabled)(struct hubbub *hubbub);
146 void (*allow_self_refresh_control)(struct hubbub *hubbub, bool allow);
147
148 void (*apply_DEDCN21_147_wa)(struct hubbub *hubbub);
149
150 void (*force_wm_propagate_to_pipes)(struct hubbub *hubbub);
151
152 void (*force_pstate_change_control)(struct hubbub *hubbub, bool force, bool allow);
153
154 void (*init_watermarks)(struct hubbub *hubbub);
155 void (*program_det_size)(struct hubbub *hubbub, int hubp_inst, unsigned det_buffer_size_in_kbyte);
156 void (*program_compbuf_size)(struct hubbub *hubbub, unsigned compbuf_size_kb, bool safe_to_increase);
157 void (*init_crb)(struct hubbub *hubbub);
158};
159
160struct hubbub {
161 const struct hubbub_funcs *funcs;
162 struct dc_context *ctx;
163 bool riommu_active;
164};
165
166#endif
167