Author: jhb
Date: Fri Jun 14 18:30:43 2013
New Revision: 251754
URL: http://svnweb.freebsd.org/changeset/base/251754

Log:
  MFC 249767:
  - 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.

Modified:
  stable/9/sys/dev/acpica/acpi.c
  stable/9/sys/dev/acpica/acpi_pci_link.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/dev/   (props changed)

Modified: stable/9/sys/dev/acpica/acpi.c
==============================================================================
--- stable/9/sys/dev/acpica/acpi.c      Fri Jun 14 18:26:57 2013        
(r251753)
+++ stable/9/sys/dev/acpica/acpi.c      Fri Jun 14 18:30:43 2013        
(r251754)
@@ -2332,7 +2332,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);
@@ -2382,7 +2382,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: stable/9/sys/dev/acpica/acpi_pci_link.c
==============================================================================
--- stable/9/sys/dev/acpica/acpi_pci_link.c     Fri Jun 14 18:26:57 2013        
(r251753)
+++ stable/9/sys/dev/acpica/acpi_pci_link.c     Fri Jun 14 18:30:43 2013        
(r251754)
@@ -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)
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to