- Some BIOSes use an Extended IRQ resource descriptor in _PRS for a link
that uses non-ISA IRQs but use a plain IRQ resource in _CRS. However, a non-ISA IRQ can't fit into a plain IRQ resource. If we encounter a link like this, build the resource buffer from _PRS instead of _CRS. - Set the correct size of the end tag in a resource buffer. Tested by: Benjamin Lee <ben@b1c1l1.com> MFC after: 2 weeks
This commit is contained in:
parent
9291a1cd14
commit
60d306f035
@ -2334,7 +2334,7 @@ acpi_AppendBufferResource(ACPI_BUFFER *buf, ACPI_RESOURCE *res)
|
||||
return (AE_NO_MEMORY);
|
||||
rp = (ACPI_RESOURCE *)buf->Pointer;
|
||||
rp->Type = ACPI_RESOURCE_TYPE_END_TAG;
|
||||
rp->Length = 0;
|
||||
rp->Length = ACPI_RS_SIZE_MIN;
|
||||
}
|
||||
if (res == NULL)
|
||||
return (AE_OK);
|
||||
@ -2384,7 +2384,7 @@ acpi_AppendBufferResource(ACPI_BUFFER *buf, ACPI_RESOURCE *res)
|
||||
/* And add the terminator. */
|
||||
rp = ACPI_NEXT_RESOURCE(rp);
|
||||
rp->Type = ACPI_RESOURCE_TYPE_END_TAG;
|
||||
rp->Length = 0;
|
||||
rp->Length = ACPI_RS_SIZE_MIN;
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
@ -99,6 +99,7 @@ struct link {
|
||||
uint8_t l_bios_irq;
|
||||
uint8_t l_irq;
|
||||
uint8_t l_initial_irq;
|
||||
UINT32 l_crs_type;
|
||||
int l_res_index;
|
||||
int l_num_irqs;
|
||||
int *l_irqs;
|
||||
@ -236,6 +237,7 @@ link_add_crs(ACPI_RESOURCE *res, void *context)
|
||||
("%s: array boundary violation", __func__));
|
||||
link = &req->sc->pl_links[req->link_index];
|
||||
link->l_res_index = req->res_index;
|
||||
link->l_crs_type = res->Type;
|
||||
req->link_index++;
|
||||
req->res_index++;
|
||||
|
||||
@ -364,6 +366,14 @@ link_add_prs(ACPI_RESOURCE *res, void *context)
|
||||
link->l_isa_irq = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If this is not an ISA IRQ but _CRS used a non-extended
|
||||
* IRQ descriptor, don't use _CRS as a template for _SRS.
|
||||
*/
|
||||
if (!req->sc->pl_crs_bad && !link->l_isa_irq &&
|
||||
link->l_crs_type == ACPI_RESOURCE_TYPE_IRQ)
|
||||
req->sc->pl_crs_bad = TRUE;
|
||||
break;
|
||||
default:
|
||||
if (req->in_dpf == DPF_IGNORE)
|
||||
|
Loading…
Reference in New Issue
Block a user