cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rsaddr.c (10633B)


      1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
      2/*******************************************************************************
      3 *
      4 * Module Name: rsaddr - Address resource descriptors (16/32/64)
      5 *
      6 ******************************************************************************/
      7
      8#include <acpi/acpi.h>
      9#include "accommon.h"
     10#include "acresrc.h"
     11
     12#define _COMPONENT          ACPI_RESOURCES
     13ACPI_MODULE_NAME("rsaddr")
     14
     15/*******************************************************************************
     16 *
     17 * acpi_rs_convert_address16 - All WORD (16-bit) address resources
     18 *
     19 ******************************************************************************/
     20struct acpi_rsconvert_info acpi_rs_convert_address16[5] = {
     21	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS16,
     22	 ACPI_RS_SIZE(struct acpi_resource_address16),
     23	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address16)},
     24
     25	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS16,
     26	 sizeof(struct aml_resource_address16),
     27	 0},
     28
     29	/* Resource Type, General Flags, and Type-Specific Flags */
     30
     31	{ACPI_RSC_ADDRESS, 0, 0, 0},
     32
     33	/*
     34	 * These fields are contiguous in both the source and destination:
     35	 * Address Granularity
     36	 * Address Range Minimum
     37	 * Address Range Maximum
     38	 * Address Translation Offset
     39	 * Address Length
     40	 */
     41	{ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.address16.address.granularity),
     42	 AML_OFFSET(address16.granularity),
     43	 5},
     44
     45	/* Optional resource_source (Index and String) */
     46
     47	{ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address16.resource_source),
     48	 0,
     49	 sizeof(struct aml_resource_address16)}
     50};
     51
     52/*******************************************************************************
     53 *
     54 * acpi_rs_convert_address32 - All DWORD (32-bit) address resources
     55 *
     56 ******************************************************************************/
     57
     58struct acpi_rsconvert_info acpi_rs_convert_address32[5] = {
     59	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS32,
     60	 ACPI_RS_SIZE(struct acpi_resource_address32),
     61	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address32)},
     62
     63	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS32,
     64	 sizeof(struct aml_resource_address32),
     65	 0},
     66
     67	/* Resource Type, General Flags, and Type-Specific Flags */
     68
     69	{ACPI_RSC_ADDRESS, 0, 0, 0},
     70
     71	/*
     72	 * These fields are contiguous in both the source and destination:
     73	 * Address Granularity
     74	 * Address Range Minimum
     75	 * Address Range Maximum
     76	 * Address Translation Offset
     77	 * Address Length
     78	 */
     79	{ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.address32.address.granularity),
     80	 AML_OFFSET(address32.granularity),
     81	 5},
     82
     83	/* Optional resource_source (Index and String) */
     84
     85	{ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address32.resource_source),
     86	 0,
     87	 sizeof(struct aml_resource_address32)}
     88};
     89
     90/*******************************************************************************
     91 *
     92 * acpi_rs_convert_address64 - All QWORD (64-bit) address resources
     93 *
     94 ******************************************************************************/
     95
     96struct acpi_rsconvert_info acpi_rs_convert_address64[5] = {
     97	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS64,
     98	 ACPI_RS_SIZE(struct acpi_resource_address64),
     99	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address64)},
    100
    101	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS64,
    102	 sizeof(struct aml_resource_address64),
    103	 0},
    104
    105	/* Resource Type, General Flags, and Type-Specific Flags */
    106
    107	{ACPI_RSC_ADDRESS, 0, 0, 0},
    108
    109	/*
    110	 * These fields are contiguous in both the source and destination:
    111	 * Address Granularity
    112	 * Address Range Minimum
    113	 * Address Range Maximum
    114	 * Address Translation Offset
    115	 * Address Length
    116	 */
    117	{ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.address64.address.granularity),
    118	 AML_OFFSET(address64.granularity),
    119	 5},
    120
    121	/* Optional resource_source (Index and String) */
    122
    123	{ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address64.resource_source),
    124	 0,
    125	 sizeof(struct aml_resource_address64)}
    126};
    127
    128/*******************************************************************************
    129 *
    130 * acpi_rs_convert_ext_address64 - All Extended (64-bit) address resources
    131 *
    132 ******************************************************************************/
    133
    134struct acpi_rsconvert_info acpi_rs_convert_ext_address64[5] = {
    135	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64,
    136	 ACPI_RS_SIZE(struct acpi_resource_extended_address64),
    137	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_ext_address64)},
    138
    139	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64,
    140	 sizeof(struct aml_resource_extended_address64),
    141	 0},
    142
    143	/* Resource Type, General Flags, and Type-Specific Flags */
    144
    145	{ACPI_RSC_ADDRESS, 0, 0, 0},
    146
    147	/* Revision ID */
    148
    149	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.ext_address64.revision_ID),
    150	 AML_OFFSET(ext_address64.revision_ID),
    151	 1},
    152	/*
    153	 * These fields are contiguous in both the source and destination:
    154	 * Address Granularity
    155	 * Address Range Minimum
    156	 * Address Range Maximum
    157	 * Address Translation Offset
    158	 * Address Length
    159	 * Type-Specific Attribute
    160	 */
    161	{ACPI_RSC_MOVE64,
    162	 ACPI_RS_OFFSET(data.ext_address64.address.granularity),
    163	 AML_OFFSET(ext_address64.granularity),
    164	 6}
    165};
    166
    167/*******************************************************************************
    168 *
    169 * acpi_rs_convert_general_flags - Flags common to all address descriptors
    170 *
    171 ******************************************************************************/
    172
    173static struct acpi_rsconvert_info acpi_rs_convert_general_flags[6] = {
    174	{ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.flags),
    175	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_general_flags)},
    176
    177	/* Resource Type (Memory, Io, bus_number, etc.) */
    178
    179	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.address.resource_type),
    180	 AML_OFFSET(address.resource_type),
    181	 1},
    182
    183	/* General flags - Consume, Decode, min_fixed, max_fixed */
    184
    185	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.producer_consumer),
    186	 AML_OFFSET(address.flags),
    187	 0},
    188
    189	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.decode),
    190	 AML_OFFSET(address.flags),
    191	 1},
    192
    193	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.min_address_fixed),
    194	 AML_OFFSET(address.flags),
    195	 2},
    196
    197	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.max_address_fixed),
    198	 AML_OFFSET(address.flags),
    199	 3}
    200};
    201
    202/*******************************************************************************
    203 *
    204 * acpi_rs_convert_mem_flags - Flags common to Memory address descriptors
    205 *
    206 ******************************************************************************/
    207
    208static struct acpi_rsconvert_info acpi_rs_convert_mem_flags[5] = {
    209	{ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.specific_flags),
    210	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_mem_flags)},
    211
    212	/* Memory-specific flags */
    213
    214	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.write_protect),
    215	 AML_OFFSET(address.specific_flags),
    216	 0},
    217
    218	{ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.caching),
    219	 AML_OFFSET(address.specific_flags),
    220	 1},
    221
    222	{ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.range_type),
    223	 AML_OFFSET(address.specific_flags),
    224	 3},
    225
    226	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.translation),
    227	 AML_OFFSET(address.specific_flags),
    228	 5}
    229};
    230
    231/*******************************************************************************
    232 *
    233 * acpi_rs_convert_io_flags - Flags common to I/O address descriptors
    234 *
    235 ******************************************************************************/
    236
    237static struct acpi_rsconvert_info acpi_rs_convert_io_flags[4] = {
    238	{ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.specific_flags),
    239	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_io_flags)},
    240
    241	/* I/O-specific flags */
    242
    243	{ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.io.range_type),
    244	 AML_OFFSET(address.specific_flags),
    245	 0},
    246
    247	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.io.translation),
    248	 AML_OFFSET(address.specific_flags),
    249	 4},
    250
    251	{ACPI_RSC_1BITFLAG,
    252	 ACPI_RS_OFFSET(data.address.info.io.translation_type),
    253	 AML_OFFSET(address.specific_flags),
    254	 5}
    255};
    256
    257/*******************************************************************************
    258 *
    259 * FUNCTION:    acpi_rs_get_address_common
    260 *
    261 * PARAMETERS:  resource            - Pointer to the internal resource struct
    262 *              aml                 - Pointer to the AML resource descriptor
    263 *
    264 * RETURN:      TRUE if the resource_type field is OK, FALSE otherwise
    265 *
    266 * DESCRIPTION: Convert common flag fields from a raw AML resource descriptor
    267 *              to an internal resource descriptor
    268 *
    269 ******************************************************************************/
    270
    271u8
    272acpi_rs_get_address_common(struct acpi_resource *resource,
    273			   union aml_resource *aml)
    274{
    275	ACPI_FUNCTION_ENTRY();
    276
    277	/* Validate the Resource Type */
    278
    279	if ((aml->address.resource_type > 2) &&
    280	    (aml->address.resource_type < 0xC0)) {
    281		return (FALSE);
    282	}
    283
    284	/* Get the Resource Type and General Flags */
    285
    286	(void)acpi_rs_convert_aml_to_resource(resource, aml,
    287					      acpi_rs_convert_general_flags);
    288
    289	/* Get the Type-Specific Flags (Memory and I/O descriptors only) */
    290
    291	if (resource->data.address.resource_type == ACPI_MEMORY_RANGE) {
    292		(void)acpi_rs_convert_aml_to_resource(resource, aml,
    293						      acpi_rs_convert_mem_flags);
    294	} else if (resource->data.address.resource_type == ACPI_IO_RANGE) {
    295		(void)acpi_rs_convert_aml_to_resource(resource, aml,
    296						      acpi_rs_convert_io_flags);
    297	} else {
    298		/* Generic resource type, just grab the type_specific byte */
    299
    300		resource->data.address.info.type_specific =
    301		    aml->address.specific_flags;
    302	}
    303
    304	return (TRUE);
    305}
    306
    307/*******************************************************************************
    308 *
    309 * FUNCTION:    acpi_rs_set_address_common
    310 *
    311 * PARAMETERS:  aml                 - Pointer to the AML resource descriptor
    312 *              resource            - Pointer to the internal resource struct
    313 *
    314 * RETURN:      None
    315 *
    316 * DESCRIPTION: Convert common flag fields from a resource descriptor to an
    317 *              AML descriptor
    318 *
    319 ******************************************************************************/
    320
    321void
    322acpi_rs_set_address_common(union aml_resource *aml,
    323			   struct acpi_resource *resource)
    324{
    325	ACPI_FUNCTION_ENTRY();
    326
    327	/* Set the Resource Type and General Flags */
    328
    329	(void)acpi_rs_convert_resource_to_aml(resource, aml,
    330					      acpi_rs_convert_general_flags);
    331
    332	/* Set the Type-Specific Flags (Memory and I/O descriptors only) */
    333
    334	if (resource->data.address.resource_type == ACPI_MEMORY_RANGE) {
    335		(void)acpi_rs_convert_resource_to_aml(resource, aml,
    336						      acpi_rs_convert_mem_flags);
    337	} else if (resource->data.address.resource_type == ACPI_IO_RANGE) {
    338		(void)acpi_rs_convert_resource_to_aml(resource, aml,
    339						      acpi_rs_convert_io_flags);
    340	} else {
    341		/* Generic resource type, just copy the type_specific byte */
    342
    343		aml->address.specific_flags =
    344		    resource->data.address.info.type_specific;
    345	}
    346}