1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 /* 27 * Copyright (c) 2009, Intel Corporation. 28 * All rights reserved. 29 */ 30 31 #ifndef _SYS_ACPIDEV_RSC_H 32 #define _SYS_ACPIDEV_RSC_H 33 #include <sys/types.h> 34 #include <sys/obpdefs.h> 35 #include <sys/sunddi.h> 36 #include <sys/acpi/acpi.h> 37 #include <sys/acpica.h> 38 39 #ifdef __cplusplus 40 extern "C" { 41 #endif 42 43 /* ACPI bus range structure. */ 44 typedef struct acpidev_bus_range { 45 uint_t bus_start; 46 uint_t bus_end; 47 } acpidev_bus_range_t; 48 49 /* 50 * This structure is modeled after the 1275 "reg" property and 51 * "assigned-addresses" property for PCI device nodes. 52 * There's no standard definition available for ACPI devices. 53 * This structure is used to store resources returned by the ACPI 54 * _CRS method. 55 * 56 * The physical address format is: 57 * Bit#: 33222222 22221111 11111100 00000000 58 * 10987654 32109876 54321098 76543210 59 * phys_hi cell: xxxxxxxx xxxxxxxx xxxxxxxx TSxxxTTT 60 * phys_hi(memory): xxxxxxxx xxxxxxxx wxxxxxcc --xxx000 61 * phys_hi(io): xxxxxxxx xxxxxxxx sdxxxxaa --xxx001 62 * phys_mid cell: hhhhhhhh hhhhhhhh hhhhhhhh hhhhhhhh 63 * phys_low cell: llllllll llllllll llllllll llllllll 64 * 65 * TTT is type of resource. Such as MEMORY, IO etc. 66 * S is 1 if address range is subtractive decoding 67 * T is 1 if resource type is different on primary and 68 * secondary bus 69 * cc is memory coherence type 70 * w is 1 if memory is writable 71 * aa ranges of decoded ports, ISA only, non-ISA only or full. 72 * d is 1 if IO port decode 16 bit address, otherwise 10 bits. 73 * s is 1 if translation is sparse. 74 * hh...hhh is the 32-bit unsigned number 75 * ll...lll is the 32-bit unsigned number 76 * 77 * The physical size format is: 78 * 79 * size_hi cell: hhhhhhhh hhhhhhhh hhhhhhhh hhhhhhhh 80 * size_low cell: llllllll llllllll llllllll llllllll 81 * 82 * hh...hhh is the 32-bit unsigned number 83 * ll...lll is the 32-bit unsigned number 84 */ 85 typedef struct acpidev_phys_spec { 86 uint_t phys_hi; /* resource address, hi word */ 87 uint_t phys_mid; /* resource address, middle word */ 88 uint_t phys_low; /* resource address, low word */ 89 uint_t size_hi; /* high word of size field */ 90 uint_t size_low; /* low word of size field */ 91 } acpidev_phys_spec_t; 92 93 typedef struct acpidev_phys_spec acpidev_regspec_t; 94 95 #define ACPIDEV_REG_TYPE_M 0x00000007 96 #define ACPIDEV_REG_TYPE_MEMORY 0x00000000 97 #define ACPIDEV_REG_TYPE_IO 0x00000001 98 #define ACPIDEV_REG_SUB_DEC 0x00000040 99 #define ACPIDEV_REG_TRANSLATED 0x00000080 100 101 #define ACPIDEV_REG_MEM_COHERENT_M 0x00000300 102 #define ACPIDEV_REG_MEM_COHERENT_NC 0x00000000 /* Non-cachable */ 103 #define ACPIDEV_REG_MEM_COHERENT_CA 0x00000100 /* Cachable */ 104 #define ACPIDEV_REG_MEM_COHERENT_WC 0x00000200 /* Write-combining */ 105 #define ACPIDEV_REG_MEM_COHERENT_PF 0x00000300 /* Prefectable */ 106 #define ACPIDEV_REG_MEM_WRITABLE 0x00008000 /* Writable */ 107 108 #define ACPIDEV_REG_IO_RANGE_M 0x00000300 109 #define ACPIDEV_REG_IO_RANGE_NONISA 0x00000100 110 #define ACPIDEV_REG_IO_RANGE_ISA 0x00000200 111 #define ACPIDEV_REG_IO_RANGE_FULL 0x00000300 112 #define ACPIDEV_REG_IO_DECODE16 0x00004000 /* Decode 16bit addr. */ 113 #define ACPIDEV_REG_IO_SPARSE 0x00008000 /* Sparse translation. */ 114 115 typedef struct acpidev_ranges { 116 uint_t child_hi; /* child's address, hi word */ 117 uint_t child_mid; /* child's address, middle word */ 118 uint_t child_low; /* child's address, low word */ 119 uint_t parent_hi; /* parent's address, hi word */ 120 uint_t parent_mid; /* parent's address, middle word */ 121 uint_t parent_low; /* parent's address, low word */ 122 uint_t size_hi; /* high word of size field */ 123 uint_t size_low; /* low word of size field */ 124 } acpidev_ranges_t; 125 126 #ifdef _KERNEL 127 128 /* Maximum possible number of IRQs. */ 129 #define ACPIDEV_RES_IRQ_MAX 16 130 /* Maximum possible number of DMAs. */ 131 #define ACPIDEV_RES_DMA_MAX 8 132 133 /* Forward declaration */ 134 typedef struct acpidev_resource_handle *acpidev_resource_handle_t; 135 136 /* 137 * Resource handler relative interfaces. 138 * Return values of acpidev_resource_get_xxx interfaces: 139 * AE_OK: succeed with resources stored in buffer and count updated. 140 * AE_LIMIT: buffer is too small, count updated to number of resources. 141 * AE_BAD_PARAMETER: invalid parameter 142 */ 143 extern acpidev_resource_handle_t acpidev_resource_handle_alloc( 144 boolean_t consumer); 145 extern void acpidev_resource_handle_free(acpidev_resource_handle_t rhdl); 146 147 extern ACPI_STATUS acpidev_resource_insert_reg(acpidev_resource_handle_t rhdl, 148 acpidev_regspec_t *regp); 149 extern ACPI_STATUS acpidev_resource_get_regs(acpidev_resource_handle_t rhdl, 150 uint_t mask, uint_t value, acpidev_regspec_t *regp, uint_t *cntp); 151 extern uint_t acpidev_resource_get_reg_count(acpidev_resource_handle_t rhdl, 152 uint_t mask, uint_t value); 153 154 extern ACPI_STATUS acpidev_resource_insert_range(acpidev_resource_handle_t rhdl, 155 acpidev_ranges_t *rangep); 156 extern ACPI_STATUS acpidev_resource_get_ranges(acpidev_resource_handle_t rhdl, 157 uint_t mask, uint_t value, acpidev_ranges_t *rangep, uint_t *cntp); 158 extern uint_t acpidev_resource_get_range_count(acpidev_resource_handle_t rhdl, 159 uint_t mask, uint_t value); 160 161 extern ACPI_STATUS acpidev_resource_insert_bus(acpidev_resource_handle_t rhdl, 162 acpidev_bus_range_t *busp); 163 extern ACPI_STATUS acpidev_resource_get_buses(acpidev_resource_handle_t rhdl, 164 acpidev_bus_range_t *busp, uint_t *cntp); 165 extern uint_t acpidev_resource_get_bus_count(acpidev_resource_handle_t rhdl); 166 167 extern ACPI_STATUS acpidev_resource_insert_dma(acpidev_resource_handle_t rhdl, 168 int dma); 169 extern ACPI_STATUS acpidev_resource_get_dmas(acpidev_resource_handle_t rhdl, 170 uint_t *dmap, uint_t *cntp); 171 extern uint_t acpidev_resource_get_dma_count(acpidev_resource_handle_t rhdl); 172 173 extern ACPI_STATUS acpidev_resource_insert_irq(acpidev_resource_handle_t rhdl, 174 int irq); 175 extern ACPI_STATUS acpidev_resource_get_irqs(acpidev_resource_handle_t rhdl, 176 uint_t *irqp, uint_t *cntp); 177 extern uint_t acpidev_resource_get_irq_count(acpidev_resource_handle_t rhdl); 178 179 /* 180 * Walk resources returned by 'method' and store parsed resources into rhdlp. 181 * Caller needs to release rhdlp after using it. 182 * Return AE_OK on success with resource handle stored in 'rhdlp'. 183 */ 184 extern ACPI_STATUS acpidev_resource_walk(ACPI_HANDLE hdl, char *method, 185 boolean_t consumer, acpidev_resource_handle_t *rhdlp); 186 187 /* 188 * Walk resources returned by the ACPI _CRS method and create device properties. 189 * Create 'reg', 'assigned-addresses', 'dma-channels' and 'interrupts' 190 * properties for resource consumer. 191 * Create 'ranges' and 'bus-range' properties for resource producer. 192 */ 193 extern ACPI_STATUS acpidev_resource_process(acpidev_walk_info_t *infop, 194 boolean_t consumer); 195 196 #endif /* _KERNEL */ 197 198 #ifdef __cplusplus 199 } 200 #endif 201 202 #endif /* _SYS_ACPIDEV_RSC_H */