svn commit: r249767 - head/sys/dev/acpica

John Baldwin jhb at FreeBSD.org
Mon Apr 22 15:51:07 UTC 2013


Author: jhb
Date: Mon Apr 22 15:51:06 2013
New Revision: 249767
URL: http://svnweb.freebsd.org/changeset/base/249767

Log:
  - 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 at b1c1l1.com>
  MFC after:	2 weeks

Modified:
  head/sys/dev/acpica/acpi.c
  head/sys/dev/acpica/acpi_pci_link.c

Modified: head/sys/dev/acpica/acpi.c
==============================================================================
--- head/sys/dev/acpica/acpi.c	Mon Apr 22 15:02:32 2013	(r249766)
+++ head/sys/dev/acpica/acpi.c	Mon Apr 22 15:51:06 2013	(r249767)
@@ -2334,7 +2334,7 @@ acpi_AppendBufferResource(ACPI_BUFFER *b
 	    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 *b
     /* 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);
 }

Modified: head/sys/dev/acpica/acpi_pci_link.c
==============================================================================
--- head/sys/dev/acpica/acpi_pci_link.c	Mon Apr 22 15:02:32 2013	(r249766)
+++ head/sys/dev/acpica/acpi_pci_link.c	Mon Apr 22 15:51:06 2013	(r249767)
@@ -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 *c
 		    ("%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 *c
 					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)


More information about the svn-src-head mailing list