diff options
Diffstat (limited to 'drivers/acpi/resource.c')
| -rw-r--r-- | drivers/acpi/resource.c | 28 | 
1 files changed, 15 insertions, 13 deletions
diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c index 8244f013f210..15d22db05054 100644 --- a/drivers/acpi/resource.c +++ b/drivers/acpi/resource.c @@ -15,10 +15,6 @@   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   *  General Public License for more details.   * - *  You should have received a copy of the GNU General Public License along - *  with this program; if not, write to the Free Software Foundation, Inc., - *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. - *   * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   */ @@ -193,6 +189,7 @@ static bool acpi_decode_space(struct resource_win *win,  	u8 iodec = attr->granularity == 0xfff ? ACPI_DECODE_10 : ACPI_DECODE_16;  	bool wp = addr->info.mem.write_protect;  	u64 len = attr->address_length; +	u64 start, end, offset = 0;  	struct resource *res = &win->res;  	/* @@ -204,9 +201,6 @@ static bool acpi_decode_space(struct resource_win *win,  		pr_debug("ACPI: Invalid address space min_addr_fix %d, max_addr_fix %d, len %llx\n",  			 addr->min_address_fixed, addr->max_address_fixed, len); -	res->start = attr->minimum; -	res->end = attr->maximum; -  	/*  	 * For bridges that translate addresses across the bridge,  	 * translation_offset is the offset that must be added to the @@ -214,12 +208,22 @@ static bool acpi_decode_space(struct resource_win *win,  	 * primary side. Non-bridge devices must list 0 for all Address  	 * Translation offset bits.  	 */ -	if (addr->producer_consumer == ACPI_PRODUCER) { -		res->start += attr->translation_offset; -		res->end += attr->translation_offset; -	} else if (attr->translation_offset) { +	if (addr->producer_consumer == ACPI_PRODUCER) +		offset = attr->translation_offset; +	else if (attr->translation_offset)  		pr_debug("ACPI: translation_offset(%lld) is invalid for non-bridge device.\n",  			 attr->translation_offset); +	start = attr->minimum + offset; +	end = attr->maximum + offset; + +	win->offset = offset; +	res->start = start; +	res->end = end; +	if (sizeof(resource_size_t) < sizeof(u64) && +	    (offset != win->offset || start != res->start || end != res->end)) { +		pr_warn("acpi resource window ([%#llx-%#llx] ignored, not CPU addressable)\n", +			attr->minimum, attr->maximum); +		return false;  	}  	switch (addr->resource_type) { @@ -236,8 +240,6 @@ static bool acpi_decode_space(struct resource_win *win,  		return false;  	} -	win->offset = attr->translation_offset; -  	if (addr->producer_consumer == ACPI_PRODUCER)  		res->flags |= IORESOURCE_WINDOW;  |