Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux-2.6-microblaze.git] / drivers / acpi / acpica / amlresrc.h
1 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
2 /******************************************************************************
3  *
4  * Module Name: amlresrc.h - AML resource descriptors
5  *
6  * Copyright (C) 2000 - 2021, Intel Corp.
7  *
8  *****************************************************************************/
9
10 /* acpisrc:struct_defs -- for acpisrc conversion */
11
12 #ifndef __AMLRESRC_H
13 #define __AMLRESRC_H
14
15 /*
16  * Resource descriptor tags, as defined in the ACPI specification.
17  * Used to symbolically reference fields within a descriptor.
18  */
19 #define ACPI_RESTAG_ADDRESS                     "_ADR"
20 #define ACPI_RESTAG_ALIGNMENT                   "_ALN"
21 #define ACPI_RESTAG_ADDRESSSPACE                "_ASI"
22 #define ACPI_RESTAG_ACCESSSIZE                  "_ASZ"
23 #define ACPI_RESTAG_TYPESPECIFICATTRIBUTES      "_ATT"
24 #define ACPI_RESTAG_BASEADDRESS                 "_BAS"
25 #define ACPI_RESTAG_BUSMASTER                   "_BM_"  /* Master(1), Slave(0) */
26 #define ACPI_RESTAG_DEBOUNCETIME                "_DBT"
27 #define ACPI_RESTAG_DECODE                      "_DEC"
28 #define ACPI_RESTAG_DEVICEPOLARITY              "_DPL"
29 #define ACPI_RESTAG_DMA                         "_DMA"
30 #define ACPI_RESTAG_DMATYPE                     "_TYP"  /* Compatible(0), A(1), B(2), F(3) */
31 #define ACPI_RESTAG_DRIVESTRENGTH               "_DRS"
32 #define ACPI_RESTAG_ENDIANNESS                  "_END"
33 #define ACPI_RESTAG_FLOWCONTROL                 "_FLC"
34 #define ACPI_RESTAG_FUNCTION                    "_FUN"
35 #define ACPI_RESTAG_GRANULARITY                 "_GRA"
36 #define ACPI_RESTAG_INTERRUPT                   "_INT"
37 #define ACPI_RESTAG_INTERRUPTLEVEL              "_LL_"  /* active_lo(1), active_hi(0) */
38 #define ACPI_RESTAG_INTERRUPTSHARE              "_SHR"  /* Shareable(1), no_share(0) */
39 #define ACPI_RESTAG_INTERRUPTTYPE               "_HE_"  /* Edge(1), Level(0) */
40 #define ACPI_RESTAG_IORESTRICTION               "_IOR"
41 #define ACPI_RESTAG_LENGTH                      "_LEN"
42 #define ACPI_RESTAG_LINE                        "_LIN"
43 #define ACPI_RESTAG_LOCALPORT                   "_PRT"
44 #define ACPI_RESTAG_MEMATTRIBUTES               "_MTP"  /* Memory(0), Reserved(1), ACPI(2), NVS(3) */
45 #define ACPI_RESTAG_MEMTYPE                     "_MEM"  /* non_cache(0), Cacheable(1) Cache+combine(2), Cache+prefetch(3) */
46 #define ACPI_RESTAG_MAXADDR                     "_MAX"
47 #define ACPI_RESTAG_MINADDR                     "_MIN"
48 #define ACPI_RESTAG_MAXTYPE                     "_MAF"
49 #define ACPI_RESTAG_MINTYPE                     "_MIF"
50 #define ACPI_RESTAG_MODE                        "_MOD"
51 #define ACPI_RESTAG_PARITY                      "_PAR"
52 #define ACPI_RESTAG_PHASE                       "_PHA"
53 #define ACPI_RESTAG_PHYTYPE                     "_PHY"
54 #define ACPI_RESTAG_PIN                         "_PIN"
55 #define ACPI_RESTAG_PINCONFIG                   "_PPI"
56 #define ACPI_RESTAG_PINCONFIG_TYPE              "_TYP"
57 #define ACPI_RESTAG_PINCONFIG_VALUE             "_VAL"
58 #define ACPI_RESTAG_POLARITY                    "_POL"
59 #define ACPI_RESTAG_REGISTERBITOFFSET           "_RBO"
60 #define ACPI_RESTAG_REGISTERBITWIDTH            "_RBW"
61 #define ACPI_RESTAG_RANGETYPE                   "_RNG"
62 #define ACPI_RESTAG_READWRITETYPE               "_RW_"  /* read_only(0), Writeable (1) */
63 #define ACPI_RESTAG_LENGTH_RX                   "_RXL"
64 #define ACPI_RESTAG_LENGTH_TX                   "_TXL"
65 #define ACPI_RESTAG_SLAVEMODE                   "_SLV"
66 #define ACPI_RESTAG_SPEED                       "_SPE"
67 #define ACPI_RESTAG_STOPBITS                    "_STB"
68 #define ACPI_RESTAG_TRANSLATION                 "_TRA"
69 #define ACPI_RESTAG_TRANSTYPE                   "_TRS"  /* Sparse(1), Dense(0) */
70 #define ACPI_RESTAG_TYPE                        "_TTP"  /* Translation(1), Static (0) */
71 #define ACPI_RESTAG_XFERTYPE                    "_SIZ"  /* 8(0), 8And16(1), 16(2) */
72 #define ACPI_RESTAG_VENDORDATA                  "_VEN"
73
74 /* Default sizes for "small" resource descriptors */
75
76 #define ASL_RDESC_IRQ_SIZE                      0x02
77 #define ASL_RDESC_DMA_SIZE                      0x02
78 #define ASL_RDESC_ST_DEPEND_SIZE                0x00
79 #define ASL_RDESC_END_DEPEND_SIZE               0x00
80 #define ASL_RDESC_IO_SIZE                       0x07
81 #define ASL_RDESC_FIXED_IO_SIZE                 0x03
82 #define ASL_RDESC_FIXED_DMA_SIZE                0x05
83 #define ASL_RDESC_END_TAG_SIZE                  0x01
84
85 struct asl_resource_node {
86         u32 buffer_length;
87         void *buffer;
88         struct asl_resource_node *next;
89 };
90
91 struct asl_resource_info {
92         union acpi_parse_object *descriptor_type_op;    /* Resource descriptor parse node */
93         union acpi_parse_object *mapping_op;    /* Used for mapfile support */
94         u32 current_byte_offset;        /* Offset in resource template */
95 };
96
97 /* Macros used to generate AML resource length fields */
98
99 #define ACPI_AML_SIZE_LARGE(r)      (sizeof (r) - sizeof (struct aml_resource_large_header))
100 #define ACPI_AML_SIZE_SMALL(r)      (sizeof (r) - sizeof (struct aml_resource_small_header))
101
102 /*
103  * Resource descriptors defined in the ACPI specification.
104  *
105  * Packing/alignment must be BYTE because these descriptors
106  * are used to overlay the raw AML byte stream.
107  */
108 #pragma pack(1)
109
110 /*
111  * SMALL descriptors
112  */
113 #define AML_RESOURCE_SMALL_HEADER_COMMON \
114         u8                              descriptor_type;
115
116 struct aml_resource_small_header {
117 AML_RESOURCE_SMALL_HEADER_COMMON};
118
119 struct aml_resource_irq {
120         AML_RESOURCE_SMALL_HEADER_COMMON u16 irq_mask;
121         u8 flags;
122 };
123
124 struct aml_resource_irq_noflags {
125         AML_RESOURCE_SMALL_HEADER_COMMON u16 irq_mask;
126 };
127
128 struct aml_resource_dma {
129         AML_RESOURCE_SMALL_HEADER_COMMON u8 dma_channel_mask;
130         u8 flags;
131 };
132
133 struct aml_resource_start_dependent {
134         AML_RESOURCE_SMALL_HEADER_COMMON u8 flags;
135 };
136
137 struct aml_resource_start_dependent_noprio {
138 AML_RESOURCE_SMALL_HEADER_COMMON};
139
140 struct aml_resource_end_dependent {
141 AML_RESOURCE_SMALL_HEADER_COMMON};
142
143 struct aml_resource_io {
144         AML_RESOURCE_SMALL_HEADER_COMMON u8 flags;
145         u16 minimum;
146         u16 maximum;
147         u8 alignment;
148         u8 address_length;
149 };
150
151 struct aml_resource_fixed_io {
152         AML_RESOURCE_SMALL_HEADER_COMMON u16 address;
153         u8 address_length;
154 };
155
156 struct aml_resource_vendor_small {
157 AML_RESOURCE_SMALL_HEADER_COMMON};
158
159 struct aml_resource_end_tag {
160         AML_RESOURCE_SMALL_HEADER_COMMON u8 checksum;
161 };
162
163 struct aml_resource_fixed_dma {
164         AML_RESOURCE_SMALL_HEADER_COMMON u16 request_lines;
165         u16 channels;
166         u8 width;
167 };
168
169 /*
170  * LARGE descriptors
171  */
172 #define AML_RESOURCE_LARGE_HEADER_COMMON \
173         u8                              descriptor_type;\
174         u16                             resource_length;
175
176 struct aml_resource_large_header {
177 AML_RESOURCE_LARGE_HEADER_COMMON};
178
179 /* General Flags for address space resource descriptors */
180
181 #define ACPI_RESOURCE_FLAG_DEC      2
182 #define ACPI_RESOURCE_FLAG_MIF      4
183 #define ACPI_RESOURCE_FLAG_MAF      8
184
185 struct aml_resource_memory24 {
186         AML_RESOURCE_LARGE_HEADER_COMMON u8 flags;
187         u16 minimum;
188         u16 maximum;
189         u16 alignment;
190         u16 address_length;
191 };
192
193 struct aml_resource_vendor_large {
194 AML_RESOURCE_LARGE_HEADER_COMMON};
195
196 struct aml_resource_memory32 {
197         AML_RESOURCE_LARGE_HEADER_COMMON u8 flags;
198         u32 minimum;
199         u32 maximum;
200         u32 alignment;
201         u32 address_length;
202 };
203
204 struct aml_resource_fixed_memory32 {
205         AML_RESOURCE_LARGE_HEADER_COMMON u8 flags;
206         u32 address;
207         u32 address_length;
208 };
209
210 #define AML_RESOURCE_ADDRESS_COMMON \
211         u8                              resource_type; \
212         u8                              flags; \
213         u8                              specific_flags;
214
215 struct aml_resource_address {
216 AML_RESOURCE_LARGE_HEADER_COMMON AML_RESOURCE_ADDRESS_COMMON};
217
218 struct aml_resource_extended_address64 {
219         AML_RESOURCE_LARGE_HEADER_COMMON
220             AML_RESOURCE_ADDRESS_COMMON u8 revision_ID;
221         u8 reserved;
222         u64 granularity;
223         u64 minimum;
224         u64 maximum;
225         u64 translation_offset;
226         u64 address_length;
227         u64 type_specific;
228 };
229
230 #define AML_RESOURCE_EXTENDED_ADDRESS_REVISION          1       /* ACPI 3.0 */
231
232 struct aml_resource_address64 {
233         AML_RESOURCE_LARGE_HEADER_COMMON
234             AML_RESOURCE_ADDRESS_COMMON u64 granularity;
235         u64 minimum;
236         u64 maximum;
237         u64 translation_offset;
238         u64 address_length;
239 };
240
241 struct aml_resource_address32 {
242         AML_RESOURCE_LARGE_HEADER_COMMON
243             AML_RESOURCE_ADDRESS_COMMON u32 granularity;
244         u32 minimum;
245         u32 maximum;
246         u32 translation_offset;
247         u32 address_length;
248 };
249
250 struct aml_resource_address16 {
251         AML_RESOURCE_LARGE_HEADER_COMMON
252             AML_RESOURCE_ADDRESS_COMMON u16 granularity;
253         u16 minimum;
254         u16 maximum;
255         u16 translation_offset;
256         u16 address_length;
257 };
258
259 struct aml_resource_extended_irq {
260         AML_RESOURCE_LARGE_HEADER_COMMON u8 flags;
261         u8 interrupt_count;
262         u32 interrupts[1];
263         /* res_source_index, res_source optional fields follow */
264 };
265
266 struct aml_resource_generic_register {
267         AML_RESOURCE_LARGE_HEADER_COMMON u8 address_space_id;
268         u8 bit_width;
269         u8 bit_offset;
270         u8 access_size;         /* ACPI 3.0, was previously Reserved */
271         u64 address;
272 };
273
274 /* Common descriptor for gpio_int and gpio_io (ACPI 5.0) */
275
276 struct aml_resource_gpio {
277         AML_RESOURCE_LARGE_HEADER_COMMON u8 revision_id;
278         u8 connection_type;
279         u16 flags;
280         u16 int_flags;
281         u8 pin_config;
282         u16 drive_strength;
283         u16 debounce_timeout;
284         u16 pin_table_offset;
285         u8 res_source_index;
286         u16 res_source_offset;
287         u16 vendor_offset;
288         u16 vendor_length;
289         /*
290          * Optional fields follow immediately:
291          * 1) PIN list (Words)
292          * 2) Resource Source String
293          * 3) Vendor Data bytes
294          */
295 };
296
297 #define AML_RESOURCE_GPIO_REVISION              1       /* ACPI 5.0 */
298
299 /* Values for connection_type above */
300
301 #define AML_RESOURCE_GPIO_TYPE_INT              0
302 #define AML_RESOURCE_GPIO_TYPE_IO               1
303 #define AML_RESOURCE_MAX_GPIOTYPE               1
304
305 /* Common preamble for all serial descriptors (ACPI 5.0) */
306
307 #define AML_RESOURCE_SERIAL_COMMON \
308         u8                              revision_id; \
309         u8                              res_source_index; \
310         u8                              type; \
311         u8                              flags; \
312         u16                             type_specific_flags; \
313         u8                              type_revision_id; \
314         u16                             type_data_length; \
315
316 /* Values for the type field above */
317
318 #define AML_RESOURCE_I2C_SERIALBUSTYPE          1
319 #define AML_RESOURCE_SPI_SERIALBUSTYPE          2
320 #define AML_RESOURCE_UART_SERIALBUSTYPE         3
321 #define AML_RESOURCE_CSI2_SERIALBUSTYPE         4
322 #define AML_RESOURCE_MAX_SERIALBUSTYPE          4
323 #define AML_RESOURCE_VENDOR_SERIALBUSTYPE       192     /* Vendor defined is 0xC0-0xFF (NOT SUPPORTED) */
324
325 struct aml_resource_common_serialbus {
326 AML_RESOURCE_LARGE_HEADER_COMMON AML_RESOURCE_SERIAL_COMMON};
327
328 struct aml_resource_csi2_serialbus {
329         AML_RESOURCE_LARGE_HEADER_COMMON AML_RESOURCE_SERIAL_COMMON
330             /*
331              * Optional fields follow immediately:
332              * 1) Vendor Data bytes
333              * 2) Resource Source String
334              */
335 };
336
337 #define AML_RESOURCE_CSI2_REVISION              1       /* ACPI 6.4 */
338 #define AML_RESOURCE_CSI2_TYPE_REVISION         1       /* ACPI 6.4 */
339 #define AML_RESOURCE_CSI2_MIN_DATA_LEN          0       /* ACPI 6.4 */
340
341 struct aml_resource_i2c_serialbus {
342         AML_RESOURCE_LARGE_HEADER_COMMON
343             AML_RESOURCE_SERIAL_COMMON u32 connection_speed;
344         u16 slave_address;
345         /*
346          * Optional fields follow immediately:
347          * 1) Vendor Data bytes
348          * 2) Resource Source String
349          */
350 };
351
352 #define AML_RESOURCE_I2C_REVISION               1       /* ACPI 5.0 */
353 #define AML_RESOURCE_I2C_TYPE_REVISION          1       /* ACPI 5.0 */
354 #define AML_RESOURCE_I2C_MIN_DATA_LEN           6
355
356 struct aml_resource_spi_serialbus {
357         AML_RESOURCE_LARGE_HEADER_COMMON
358             AML_RESOURCE_SERIAL_COMMON u32 connection_speed;
359         u8 data_bit_length;
360         u8 clock_phase;
361         u8 clock_polarity;
362         u16 device_selection;
363         /*
364          * Optional fields follow immediately:
365          * 1) Vendor Data bytes
366          * 2) Resource Source String
367          */
368 };
369
370 #define AML_RESOURCE_SPI_REVISION               1       /* ACPI 5.0 */
371 #define AML_RESOURCE_SPI_TYPE_REVISION          1       /* ACPI 5.0 */
372 #define AML_RESOURCE_SPI_MIN_DATA_LEN           9
373
374 struct aml_resource_uart_serialbus {
375         AML_RESOURCE_LARGE_HEADER_COMMON
376             AML_RESOURCE_SERIAL_COMMON u32 default_baud_rate;
377         u16 rx_fifo_size;
378         u16 tx_fifo_size;
379         u8 parity;
380         u8 lines_enabled;
381         /*
382          * Optional fields follow immediately:
383          * 1) Vendor Data bytes
384          * 2) Resource Source String
385          */
386 };
387
388 #define AML_RESOURCE_UART_REVISION              1       /* ACPI 5.0 */
389 #define AML_RESOURCE_UART_TYPE_REVISION         1       /* ACPI 5.0 */
390 #define AML_RESOURCE_UART_MIN_DATA_LEN          10
391
392 struct aml_resource_pin_function {
393         AML_RESOURCE_LARGE_HEADER_COMMON u8 revision_id;
394         u16 flags;
395         u8 pin_config;
396         u16 function_number;
397         u16 pin_table_offset;
398         u8 res_source_index;
399         u16 res_source_offset;
400         u16 vendor_offset;
401         u16 vendor_length;
402         /*
403          * Optional fields follow immediately:
404          * 1) PIN list (Words)
405          * 2) Resource Source String
406          * 3) Vendor Data bytes
407          */
408 };
409
410 #define AML_RESOURCE_PIN_FUNCTION_REVISION      1       /* ACPI 6.2 */
411
412 struct aml_resource_pin_config {
413         AML_RESOURCE_LARGE_HEADER_COMMON u8 revision_id;
414         u16 flags;
415         u8 pin_config_type;
416         u32 pin_config_value;
417         u16 pin_table_offset;
418         u8 res_source_index;
419         u16 res_source_offset;
420         u16 vendor_offset;
421         u16 vendor_length;
422         /*
423          * Optional fields follow immediately:
424          * 1) PIN list (Words)
425          * 2) Resource Source String
426          * 3) Vendor Data bytes
427          */
428 };
429
430 #define AML_RESOURCE_PIN_CONFIG_REVISION      1 /* ACPI 6.2 */
431
432 struct aml_resource_pin_group {
433         AML_RESOURCE_LARGE_HEADER_COMMON u8 revision_id;
434         u16 flags;
435         u16 pin_table_offset;
436         u16 label_offset;
437         u16 vendor_offset;
438         u16 vendor_length;
439         /*
440          * Optional fields follow immediately:
441          * 1) PIN list (Words)
442          * 2) Resource Label String
443          * 3) Vendor Data bytes
444          */
445 };
446
447 #define AML_RESOURCE_PIN_GROUP_REVISION      1  /* ACPI 6.2 */
448
449 struct aml_resource_pin_group_function {
450         AML_RESOURCE_LARGE_HEADER_COMMON u8 revision_id;
451         u16 flags;
452         u16 function_number;
453         u8 res_source_index;
454         u16 res_source_offset;
455         u16 res_source_label_offset;
456         u16 vendor_offset;
457         u16 vendor_length;
458         /*
459          * Optional fields follow immediately:
460          * 1) Resource Source String
461          * 2) Resource Source Label String
462          * 3) Vendor Data bytes
463          */
464 };
465
466 #define AML_RESOURCE_PIN_GROUP_FUNCTION_REVISION    1   /* ACPI 6.2 */
467
468 struct aml_resource_pin_group_config {
469         AML_RESOURCE_LARGE_HEADER_COMMON u8 revision_id;
470         u16 flags;
471         u8 pin_config_type;
472         u32 pin_config_value;
473         u8 res_source_index;
474         u16 res_source_offset;
475         u16 res_source_label_offset;
476         u16 vendor_offset;
477         u16 vendor_length;
478         /*
479          * Optional fields follow immediately:
480          * 1) Resource Source String
481          * 2) Resource Source Label String
482          * 3) Vendor Data bytes
483          */
484 };
485
486 #define AML_RESOURCE_PIN_GROUP_CONFIG_REVISION    1     /* ACPI 6.2 */
487
488 /* restore default alignment */
489
490 #pragma pack()
491
492 /* Union of all resource descriptors, so we can allocate the worst case */
493
494 union aml_resource {
495         /* Descriptor headers */
496
497         u8 descriptor_type;
498         struct aml_resource_small_header small_header;
499         struct aml_resource_large_header large_header;
500
501         /* Small resource descriptors */
502
503         struct aml_resource_irq irq;
504         struct aml_resource_dma dma;
505         struct aml_resource_start_dependent start_dpf;
506         struct aml_resource_end_dependent end_dpf;
507         struct aml_resource_io io;
508         struct aml_resource_fixed_io fixed_io;
509         struct aml_resource_fixed_dma fixed_dma;
510         struct aml_resource_vendor_small vendor_small;
511         struct aml_resource_end_tag end_tag;
512
513         /* Large resource descriptors */
514
515         struct aml_resource_memory24 memory24;
516         struct aml_resource_generic_register generic_reg;
517         struct aml_resource_vendor_large vendor_large;
518         struct aml_resource_memory32 memory32;
519         struct aml_resource_fixed_memory32 fixed_memory32;
520         struct aml_resource_address16 address16;
521         struct aml_resource_address32 address32;
522         struct aml_resource_address64 address64;
523         struct aml_resource_extended_address64 ext_address64;
524         struct aml_resource_extended_irq extended_irq;
525         struct aml_resource_gpio gpio;
526         struct aml_resource_i2c_serialbus i2c_serial_bus;
527         struct aml_resource_spi_serialbus spi_serial_bus;
528         struct aml_resource_uart_serialbus uart_serial_bus;
529         struct aml_resource_csi2_serialbus csi2_serial_bus;
530         struct aml_resource_common_serialbus common_serial_bus;
531         struct aml_resource_pin_function pin_function;
532         struct aml_resource_pin_config pin_config;
533         struct aml_resource_pin_group pin_group;
534         struct aml_resource_pin_group_function pin_group_function;
535         struct aml_resource_pin_group_config pin_group_config;
536
537         /* Utility overlays */
538
539         struct aml_resource_address address;
540         u32 dword_item;
541         u16 word_item;
542         u8 byte_item;
543 };
544
545 /* Interfaces used by both the disassembler and compiler */
546
547 void
548 mp_save_gpio_info(union acpi_parse_object *op,
549                   union aml_resource *resource,
550                   u32 pin_count, u16 *pin_list, char *device_name);
551
552 void
553 mp_save_serial_info(union acpi_parse_object *op,
554                     union aml_resource *resource, char *device_name);
555
556 char *mp_get_hid_from_parse_tree(struct acpi_namespace_node *hid_node);
557
558 char *mp_get_hid_via_namestring(char *device_name);
559
560 char *mp_get_connection_info(union acpi_parse_object *op,
561                              u32 pin_index,
562                              struct acpi_namespace_node **target_node,
563                              char **target_name);
564
565 char *mp_get_parent_device_hid(union acpi_parse_object *op,
566                                struct acpi_namespace_node **target_node,
567                                char **parent_device_name);
568
569 char *mp_get_ddn_value(char *device_name);
570
571 char *mp_get_hid_value(struct acpi_namespace_node *device_node);
572
573 #endif