12
12
13
13
#include "xe_assert.h"
14
14
#include "xe_device.h"
15
- #include "xe_gt.h"
16
15
#include "xe_mmio.h"
17
16
#include "xe_pcode_api.h"
18
17
30
29
* - PCODE for display operations
31
30
*/
32
31
33
- static int pcode_mailbox_status (struct xe_gt * gt )
32
+ static int pcode_mailbox_status (struct xe_tile * tile )
34
33
{
35
34
u32 err ;
36
35
static const struct pcode_err_decode err_decode [] = {
@@ -45,94 +44,95 @@ static int pcode_mailbox_status(struct xe_gt *gt)
45
44
[PCODE_ERROR_MASK ] = {- EPROTO , "Unknown" },
46
45
};
47
46
48
- err = xe_mmio_read32 (gt , PCODE_MAILBOX ) & PCODE_ERROR_MASK ;
47
+ err = xe_mmio_read32 (tile -> primary_gt , PCODE_MAILBOX ) & PCODE_ERROR_MASK ;
49
48
if (err ) {
50
- drm_err (& gt_to_xe ( gt )-> drm , "PCODE Mailbox failed: %d %s" , err ,
49
+ drm_err (& tile_to_xe ( tile )-> drm , "PCODE Mailbox failed: %d %s" , err ,
51
50
err_decode [err ].str ?: "Unknown" );
52
51
return err_decode [err ].errno ?: - EPROTO ;
53
52
}
54
53
55
54
return 0 ;
56
55
}
57
56
58
- static int __pcode_mailbox_rw (struct xe_gt * gt , u32 mbox , u32 * data0 , u32 * data1 ,
57
+ static int __pcode_mailbox_rw (struct xe_tile * tile , u32 mbox , u32 * data0 , u32 * data1 ,
59
58
unsigned int timeout_ms , bool return_data ,
60
59
bool atomic )
61
60
{
61
+ struct xe_gt * mmio = tile -> primary_gt ;
62
62
int err ;
63
63
64
- if (gt_to_xe ( gt )-> info .skip_pcode )
64
+ if (tile_to_xe ( tile )-> info .skip_pcode )
65
65
return 0 ;
66
66
67
- if ((xe_mmio_read32 (gt , PCODE_MAILBOX ) & PCODE_READY ) != 0 )
67
+ if ((xe_mmio_read32 (mmio , PCODE_MAILBOX ) & PCODE_READY ) != 0 )
68
68
return - EAGAIN ;
69
69
70
- xe_mmio_write32 (gt , PCODE_DATA0 , * data0 );
71
- xe_mmio_write32 (gt , PCODE_DATA1 , data1 ? * data1 : 0 );
72
- xe_mmio_write32 (gt , PCODE_MAILBOX , PCODE_READY | mbox );
70
+ xe_mmio_write32 (mmio , PCODE_DATA0 , * data0 );
71
+ xe_mmio_write32 (mmio , PCODE_DATA1 , data1 ? * data1 : 0 );
72
+ xe_mmio_write32 (mmio , PCODE_MAILBOX , PCODE_READY | mbox );
73
73
74
- err = xe_mmio_wait32 (gt , PCODE_MAILBOX , PCODE_READY , 0 ,
74
+ err = xe_mmio_wait32 (mmio , PCODE_MAILBOX , PCODE_READY , 0 ,
75
75
timeout_ms * USEC_PER_MSEC , NULL , atomic );
76
76
if (err )
77
77
return err ;
78
78
79
79
if (return_data ) {
80
- * data0 = xe_mmio_read32 (gt , PCODE_DATA0 );
80
+ * data0 = xe_mmio_read32 (mmio , PCODE_DATA0 );
81
81
if (data1 )
82
- * data1 = xe_mmio_read32 (gt , PCODE_DATA1 );
82
+ * data1 = xe_mmio_read32 (mmio , PCODE_DATA1 );
83
83
}
84
84
85
- return pcode_mailbox_status (gt );
85
+ return pcode_mailbox_status (tile );
86
86
}
87
87
88
- static int pcode_mailbox_rw (struct xe_gt * gt , u32 mbox , u32 * data0 , u32 * data1 ,
88
+ static int pcode_mailbox_rw (struct xe_tile * tile , u32 mbox , u32 * data0 , u32 * data1 ,
89
89
unsigned int timeout_ms , bool return_data ,
90
90
bool atomic )
91
91
{
92
- if (gt_to_xe ( gt )-> info .skip_pcode )
92
+ if (tile_to_xe ( tile )-> info .skip_pcode )
93
93
return 0 ;
94
94
95
- lockdep_assert_held (& gt -> pcode .lock );
95
+ lockdep_assert_held (& tile -> pcode .lock );
96
96
97
- return __pcode_mailbox_rw (gt , mbox , data0 , data1 , timeout_ms , return_data , atomic );
97
+ return __pcode_mailbox_rw (tile , mbox , data0 , data1 , timeout_ms , return_data , atomic );
98
98
}
99
99
100
- int xe_pcode_write_timeout (struct xe_gt * gt , u32 mbox , u32 data , int timeout )
100
+ int xe_pcode_write_timeout (struct xe_tile * tile , u32 mbox , u32 data , int timeout )
101
101
{
102
102
int err ;
103
103
104
- mutex_lock (& gt -> pcode .lock );
105
- err = pcode_mailbox_rw (gt , mbox , & data , NULL , timeout , false, false);
106
- mutex_unlock (& gt -> pcode .lock );
104
+ mutex_lock (& tile -> pcode .lock );
105
+ err = pcode_mailbox_rw (tile , mbox , & data , NULL , timeout , false, false);
106
+ mutex_unlock (& tile -> pcode .lock );
107
107
108
108
return err ;
109
109
}
110
110
111
- int xe_pcode_read (struct xe_gt * gt , u32 mbox , u32 * val , u32 * val1 )
111
+ int xe_pcode_read (struct xe_tile * tile , u32 mbox , u32 * val , u32 * val1 )
112
112
{
113
113
int err ;
114
114
115
- mutex_lock (& gt -> pcode .lock );
116
- err = pcode_mailbox_rw (gt , mbox , val , val1 , 1 , true, false);
117
- mutex_unlock (& gt -> pcode .lock );
115
+ mutex_lock (& tile -> pcode .lock );
116
+ err = pcode_mailbox_rw (tile , mbox , val , val1 , 1 , true, false);
117
+ mutex_unlock (& tile -> pcode .lock );
118
118
119
119
return err ;
120
120
}
121
121
122
- static int pcode_try_request (struct xe_gt * gt , u32 mbox ,
122
+ static int pcode_try_request (struct xe_tile * tile , u32 mbox ,
123
123
u32 request , u32 reply_mask , u32 reply ,
124
124
u32 * status , bool atomic , int timeout_us , bool locked )
125
125
{
126
126
int slept , wait = 10 ;
127
127
128
- xe_gt_assert ( gt , timeout_us > 0 );
128
+ xe_tile_assert ( tile , timeout_us > 0 );
129
129
130
130
for (slept = 0 ; slept < timeout_us ; slept += wait ) {
131
131
if (locked )
132
- * status = pcode_mailbox_rw (gt , mbox , & request , NULL , 1 , true,
132
+ * status = pcode_mailbox_rw (tile , mbox , & request , NULL , 1 , true,
133
133
atomic );
134
134
else
135
- * status = __pcode_mailbox_rw (gt , mbox , & request , NULL , 1 , true,
135
+ * status = __pcode_mailbox_rw (tile , mbox , & request , NULL , 1 , true,
136
136
atomic );
137
137
if ((* status == 0 ) && ((request & reply_mask ) == reply ))
138
138
return 0 ;
@@ -149,7 +149,7 @@ static int pcode_try_request(struct xe_gt *gt, u32 mbox,
149
149
150
150
/**
151
151
* xe_pcode_request - send PCODE request until acknowledgment
152
- * @gt: gt
152
+ * @tile: tile
153
153
* @mbox: PCODE mailbox ID the request is targeted for
154
154
* @request: request ID
155
155
* @reply_mask: mask used to check for request acknowledgment
@@ -166,17 +166,17 @@ static int pcode_try_request(struct xe_gt *gt, u32 mbox,
166
166
* Returns 0 on success, %-ETIMEDOUT in case of a timeout, <0 in case of some
167
167
* other error as reported by PCODE.
168
168
*/
169
- int xe_pcode_request (struct xe_gt * gt , u32 mbox , u32 request ,
170
- u32 reply_mask , u32 reply , int timeout_base_ms )
169
+ int xe_pcode_request (struct xe_tile * tile , u32 mbox , u32 request ,
170
+ u32 reply_mask , u32 reply , int timeout_base_ms )
171
171
{
172
172
u32 status ;
173
173
int ret ;
174
174
175
- xe_gt_assert ( gt , timeout_base_ms <= 3 );
175
+ xe_tile_assert ( tile , timeout_base_ms <= 3 );
176
176
177
- mutex_lock (& gt -> pcode .lock );
177
+ mutex_lock (& tile -> pcode .lock );
178
178
179
- ret = pcode_try_request (gt , mbox , request , reply_mask , reply , & status ,
179
+ ret = pcode_try_request (tile , mbox , request , reply_mask , reply , & status ,
180
180
false, timeout_base_ms * 1000 , true);
181
181
if (!ret )
182
182
goto out ;
@@ -191,20 +191,20 @@ int xe_pcode_request(struct xe_gt *gt, u32 mbox, u32 request,
191
191
* requests, and for any quirks of the PCODE firmware that delays
192
192
* the request completion.
193
193
*/
194
- drm_err (& gt_to_xe ( gt )-> drm ,
194
+ drm_err (& tile_to_xe ( tile )-> drm ,
195
195
"PCODE timeout, retrying with preemption disabled\n" );
196
196
preempt_disable ();
197
- ret = pcode_try_request (gt , mbox , request , reply_mask , reply , & status ,
197
+ ret = pcode_try_request (tile , mbox , request , reply_mask , reply , & status ,
198
198
true, 50 * 1000 , true);
199
199
preempt_enable ();
200
200
201
201
out :
202
- mutex_unlock (& gt -> pcode .lock );
202
+ mutex_unlock (& tile -> pcode .lock );
203
203
return status ? status : ret ;
204
204
}
205
205
/**
206
206
* xe_pcode_init_min_freq_table - Initialize PCODE's QOS frequency table
207
- * @gt: gt instance
207
+ * @tile: tile instance
208
208
* @min_gt_freq: Minimal (RPn) GT frequency in units of 50MHz.
209
209
* @max_gt_freq: Maximal (RP0) GT frequency in units of 50MHz.
210
210
*
@@ -227,30 +227,30 @@ int xe_pcode_request(struct xe_gt *gt, u32 mbox, u32 request,
227
227
* - -EACCES, "PCODE Rejected"
228
228
* - -EPROTO, "Unknown"
229
229
*/
230
- int xe_pcode_init_min_freq_table (struct xe_gt * gt , u32 min_gt_freq ,
230
+ int xe_pcode_init_min_freq_table (struct xe_tile * tile , u32 min_gt_freq ,
231
231
u32 max_gt_freq )
232
232
{
233
233
int ret ;
234
234
u32 freq ;
235
235
236
- if (!gt_to_xe ( gt )-> info .has_llc )
236
+ if (!tile_to_xe ( tile )-> info .has_llc )
237
237
return 0 ;
238
238
239
239
if (max_gt_freq <= min_gt_freq )
240
240
return - EINVAL ;
241
241
242
- mutex_lock (& gt -> pcode .lock );
242
+ mutex_lock (& tile -> pcode .lock );
243
243
for (freq = min_gt_freq ; freq <= max_gt_freq ; freq ++ ) {
244
244
u32 data = freq << PCODE_FREQ_RING_RATIO_SHIFT | freq ;
245
245
246
- ret = pcode_mailbox_rw (gt , PCODE_WRITE_MIN_FREQ_TABLE ,
246
+ ret = pcode_mailbox_rw (tile , PCODE_WRITE_MIN_FREQ_TABLE ,
247
247
& data , NULL , 1 , false, false);
248
248
if (ret )
249
249
goto unlock ;
250
250
}
251
251
252
252
unlock :
253
- mutex_unlock (& gt -> pcode .lock );
253
+ mutex_unlock (& tile -> pcode .lock );
254
254
return ret ;
255
255
}
256
256
@@ -270,7 +270,7 @@ int xe_pcode_init_min_freq_table(struct xe_gt *gt, u32 min_gt_freq,
270
270
int xe_pcode_ready (struct xe_device * xe , bool locked )
271
271
{
272
272
u32 status , request = DGFX_GET_INIT_STATUS ;
273
- struct xe_gt * gt = xe_root_mmio_gt (xe );
273
+ struct xe_tile * tile = xe_device_get_root_tile (xe );
274
274
int timeout_us = 180000000 ; /* 3 min */
275
275
int ret ;
276
276
@@ -281,15 +281,15 @@ int xe_pcode_ready(struct xe_device *xe, bool locked)
281
281
return 0 ;
282
282
283
283
if (locked )
284
- mutex_lock (& gt -> pcode .lock );
284
+ mutex_lock (& tile -> pcode .lock );
285
285
286
- ret = pcode_try_request (gt , DGFX_PCODE_STATUS , request ,
286
+ ret = pcode_try_request (tile , DGFX_PCODE_STATUS , request ,
287
287
DGFX_INIT_STATUS_COMPLETE ,
288
288
DGFX_INIT_STATUS_COMPLETE ,
289
289
& status , false, timeout_us , locked );
290
290
291
291
if (locked )
292
- mutex_unlock (& gt -> pcode .lock );
292
+ mutex_unlock (& tile -> pcode .lock );
293
293
294
294
if (ret )
295
295
drm_err (& xe -> drm ,
@@ -300,14 +300,14 @@ int xe_pcode_ready(struct xe_device *xe, bool locked)
300
300
301
301
/**
302
302
* xe_pcode_init: initialize components of PCODE
303
- * @gt: gt instance
303
+ * @tile: tile instance
304
304
*
305
305
* This function initializes the xe_pcode component.
306
306
* To be called once only during probe.
307
307
*/
308
- void xe_pcode_init (struct xe_gt * gt )
308
+ void xe_pcode_init (struct xe_tile * tile )
309
309
{
310
- drmm_mutex_init (& gt_to_xe ( gt )-> drm , & gt -> pcode .lock );
310
+ drmm_mutex_init (& tile_to_xe ( tile )-> drm , & tile -> pcode .lock );
311
311
}
312
312
313
313
/**
0 commit comments