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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45#include <acpi/acpi.h>
46#include <acpi/acinterp.h>
47
48#define _COMPONENT ACPI_EXECUTER
49ACPI_MODULE_NAME("exregion")
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68acpi_status
69acpi_ex_system_memory_space_handler(u32 function,
70 acpi_physical_address address,
71 u32 bit_width,
72 acpi_integer * value,
73 void *handler_context, void *region_context)
74{
75 acpi_status status = AE_OK;
76 void *logical_addr_ptr = NULL;
77 struct acpi_mem_space_context *mem_info = region_context;
78 u32 length;
79 acpi_size window_size;
80#ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED
81 u32 remainder;
82#endif
83
84 ACPI_FUNCTION_TRACE(ex_system_memory_space_handler);
85
86
87
88 switch (bit_width) {
89 case 8:
90 length = 1;
91 break;
92
93 case 16:
94 length = 2;
95 break;
96
97 case 32:
98 length = 4;
99 break;
100
101 case 64:
102 length = 8;
103 break;
104
105 default:
106 ACPI_ERROR((AE_INFO, "Invalid SystemMemory width %d",
107 bit_width));
108 return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
109 }
110
111#ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED
112
113
114
115
116 (void)acpi_ut_short_divide((acpi_integer) address, length, NULL,
117 &remainder);
118 if (remainder != 0) {
119 return_ACPI_STATUS(AE_AML_ALIGNMENT);
120 }
121#endif
122
123
124
125
126
127
128 if ((address < mem_info->mapped_physical_address) ||
129 (((acpi_integer) address + length) > ((acpi_integer)
130 mem_info->
131 mapped_physical_address +
132 mem_info->mapped_length))) {
133
134
135
136
137 if (mem_info->mapped_length) {
138
139
140
141 acpi_os_unmap_memory(mem_info->mapped_logical_address,
142 mem_info->mapped_length);
143 }
144
145
146
147
148
149 window_size = (acpi_size)
150 ((mem_info->address + mem_info->length) - address);
151
152 if (window_size > ACPI_SYSMEM_REGION_WINDOW_SIZE) {
153 window_size = ACPI_SYSMEM_REGION_WINDOW_SIZE;
154 }
155
156
157
158 mem_info->mapped_logical_address =
159 acpi_os_map_memory((acpi_physical_address) address, window_size);
160 if (!mem_info->mapped_logical_address) {
161 ACPI_ERROR((AE_INFO,
162 "Could not map memory at %8.8X%8.8X, size %X",
163 ACPI_FORMAT_NATIVE_UINT(address),
164 (u32) window_size));
165 mem_info->mapped_length = 0;
166 return_ACPI_STATUS(AE_NO_MEMORY);
167 }
168
169
170
171 mem_info->mapped_physical_address = address;
172 mem_info->mapped_length = window_size;
173 }
174
175
176
177
178
179 logical_addr_ptr = mem_info->mapped_logical_address +
180 ((acpi_integer) address -
181 (acpi_integer) mem_info->mapped_physical_address);
182
183 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
184 "System-Memory (width %d) R/W %d Address=%8.8X%8.8X\n",
185 bit_width, function,
186 ACPI_FORMAT_NATIVE_UINT(address)));
187
188
189
190
191
192
193
194
195
196 switch (function) {
197 case ACPI_READ:
198
199 *value = 0;
200 switch (bit_width) {
201 case 8:
202 *value = (acpi_integer) ACPI_GET8(logical_addr_ptr);
203 break;
204
205 case 16:
206 *value = (acpi_integer) ACPI_GET16(logical_addr_ptr);
207 break;
208
209 case 32:
210 *value = (acpi_integer) ACPI_GET32(logical_addr_ptr);
211 break;
212
213 case 64:
214 *value = (acpi_integer) ACPI_GET64(logical_addr_ptr);
215 break;
216
217 default:
218
219 break;
220 }
221 break;
222
223 case ACPI_WRITE:
224
225 switch (bit_width) {
226 case 8:
227 ACPI_SET8(logical_addr_ptr) = (u8) * value;
228 break;
229
230 case 16:
231 ACPI_SET16(logical_addr_ptr) = (u16) * value;
232 break;
233
234 case 32:
235 ACPI_SET32(logical_addr_ptr) = (u32) * value;
236 break;
237
238 case 64:
239 ACPI_SET64(logical_addr_ptr) = (u64) * value;
240 break;
241
242 default:
243
244 break;
245 }
246 break;
247
248 default:
249 status = AE_BAD_PARAMETER;
250 break;
251 }
252
253 return_ACPI_STATUS(status);
254}
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274acpi_status
275acpi_ex_system_io_space_handler(u32 function,
276 acpi_physical_address address,
277 u32 bit_width,
278 acpi_integer * value,
279 void *handler_context, void *region_context)
280{
281 acpi_status status = AE_OK;
282 u32 value32;
283
284 ACPI_FUNCTION_TRACE(ex_system_io_space_handler);
285
286 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
287 "System-IO (width %d) R/W %d Address=%8.8X%8.8X\n",
288 bit_width, function,
289 ACPI_FORMAT_NATIVE_UINT(address)));
290
291
292
293 switch (function) {
294 case ACPI_READ:
295
296 status = acpi_os_read_port((acpi_io_address) address,
297 &value32, bit_width);
298 *value = value32;
299 break;
300
301 case ACPI_WRITE:
302
303 status = acpi_os_write_port((acpi_io_address) address,
304 (u32) * value, bit_width);
305 break;
306
307 default:
308 status = AE_BAD_PARAMETER;
309 break;
310 }
311
312 return_ACPI_STATUS(status);
313}
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333acpi_status
334acpi_ex_pci_config_space_handler(u32 function,
335 acpi_physical_address address,
336 u32 bit_width,
337 acpi_integer * value,
338 void *handler_context, void *region_context)
339{
340 acpi_status status = AE_OK;
341 struct acpi_pci_id *pci_id;
342 u16 pci_register;
343 u32 value32;
344
345 ACPI_FUNCTION_TRACE(ex_pci_config_space_handler);
346
347
348
349
350
351
352
353
354
355
356
357
358
359 pci_id = (struct acpi_pci_id *)region_context;
360 pci_register = (u16) (u32) address;
361
362 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
363 "Pci-Config %d (%d) Seg(%04x) Bus(%04x) Dev(%04x) Func(%04x) Reg(%04x)\n",
364 function, bit_width, pci_id->segment, pci_id->bus,
365 pci_id->device, pci_id->function, pci_register));
366
367 switch (function) {
368 case ACPI_READ:
369
370 status = acpi_os_read_pci_configuration(pci_id, pci_register,
371 &value32, bit_width);
372 *value = value32;
373 break;
374
375 case ACPI_WRITE:
376
377 status = acpi_os_write_pci_configuration(pci_id, pci_register,
378 *value, bit_width);
379 break;
380
381 default:
382
383 status = AE_BAD_PARAMETER;
384 break;
385 }
386
387 return_ACPI_STATUS(status);
388}
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408acpi_status
409acpi_ex_cmos_space_handler(u32 function,
410 acpi_physical_address address,
411 u32 bit_width,
412 acpi_integer * value,
413 void *handler_context, void *region_context)
414{
415 acpi_status status = AE_OK;
416
417 ACPI_FUNCTION_TRACE(ex_cmos_space_handler);
418
419 return_ACPI_STATUS(status);
420}
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440acpi_status
441acpi_ex_pci_bar_space_handler(u32 function,
442 acpi_physical_address address,
443 u32 bit_width,
444 acpi_integer * value,
445 void *handler_context, void *region_context)
446{
447 acpi_status status = AE_OK;
448
449 ACPI_FUNCTION_TRACE(ex_pci_bar_space_handler);
450
451 return_ACPI_STATUS(status);
452}
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472acpi_status
473acpi_ex_data_table_space_handler(u32 function,
474 acpi_physical_address address,
475 u32 bit_width,
476 acpi_integer * value,
477 void *handler_context, void *region_context)
478{
479 ACPI_FUNCTION_TRACE(ex_data_table_space_handler);
480
481
482
483 switch (function) {
484 case ACPI_READ:
485
486 ACPI_MEMCPY(ACPI_CAST_PTR(char, value),
487 ACPI_PHYSADDR_TO_PTR(address),
488 ACPI_DIV_8(bit_width));
489 break;
490
491 case ACPI_WRITE:
492 default:
493
494 return_ACPI_STATUS(AE_SUPPORT);
495 }
496
497 return_ACPI_STATUS(AE_OK);
498}
499