Use ASSERT macro instead of assert macro.
[reactos.git] / reactos / hal / halx86 / pci.c
index 4ce1657..a304255 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: pci.c,v 1.9 2003/04/26 07:06:54 hbirr Exp $
+/* $Id: pci.c,v 1.12 2004/10/22 20:08:22 ekohl Exp $
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
@@ -86,7 +86,7 @@ ReadPciConfigUchar(UCHAR Bus,
 
      case 2:
         KeAcquireSpinLock(&PciLock, &oldIrql);
-       WRITE_PORT_UCHAR((PUCHAR)0xCF8, FUNC(Slot));
+       WRITE_PORT_UCHAR((PUCHAR)0xCF8, (UCHAR)FUNC(Slot));
        WRITE_PORT_UCHAR((PUCHAR)0xCFA, Bus);
        *Value = READ_PORT_UCHAR((PUCHAR)(IOADDR(Slot, Offset)));
        WRITE_PORT_UCHAR((PUCHAR)0xCF8, 0);
@@ -121,7 +121,7 @@ ReadPciConfigUshort(UCHAR Bus,
 
      case 2:
         KeAcquireSpinLock(&PciLock, &oldIrql);
-       WRITE_PORT_UCHAR((PUCHAR)0xCF8, FUNC(Slot));
+       WRITE_PORT_UCHAR((PUCHAR)0xCF8, (UCHAR)FUNC(Slot));
        WRITE_PORT_UCHAR((PUCHAR)0xCFA, Bus);
        *Value = READ_PORT_USHORT((PUSHORT)(IOADDR(Slot, Offset)));
        WRITE_PORT_UCHAR((PUCHAR)0xCF8, 0);
@@ -156,7 +156,7 @@ ReadPciConfigUlong(UCHAR Bus,
 
      case 2:
         KeAcquireSpinLock(&PciLock, &oldIrql);
-       WRITE_PORT_UCHAR((PUCHAR)0xCF8, FUNC(Slot));
+       WRITE_PORT_UCHAR((PUCHAR)0xCF8, (UCHAR)FUNC(Slot));
        WRITE_PORT_UCHAR((PUCHAR)0xCFA, Bus);
        *Value = READ_PORT_ULONG((PULONG)(IOADDR(Slot, Offset)));
        WRITE_PORT_UCHAR((PUCHAR)0xCF8, 0);
@@ -186,7 +186,7 @@ WritePciConfigUchar(UCHAR Bus,
 
      case 2:
         KeAcquireSpinLock(&PciLock, &oldIrql);
-       WRITE_PORT_UCHAR((PUCHAR)0xCF8, FUNC(Slot));
+       WRITE_PORT_UCHAR((PUCHAR)0xCF8, (UCHAR)FUNC(Slot));
        WRITE_PORT_UCHAR((PUCHAR)0xCFA, Bus);
        WRITE_PORT_UCHAR((PUCHAR)(IOADDR(Slot,Offset)), Value);
        WRITE_PORT_UCHAR((PUCHAR)0xCF8, 0);
@@ -221,7 +221,7 @@ WritePciConfigUshort(UCHAR Bus,
 
      case 2:
         KeAcquireSpinLock(&PciLock, &oldIrql);
-       WRITE_PORT_UCHAR((PUCHAR)0xCF8, FUNC(Slot));
+       WRITE_PORT_UCHAR((PUCHAR)0xCF8, (UCHAR)FUNC(Slot));
        WRITE_PORT_UCHAR((PUCHAR)0xCFA, Bus);
        WRITE_PORT_USHORT((PUSHORT)(IOADDR(Slot, Offset)), Value);
        WRITE_PORT_UCHAR((PUCHAR)0xCF8, 0);
@@ -256,7 +256,7 @@ WritePciConfigUlong(UCHAR Bus,
 
      case 2:
         KeAcquireSpinLock(&PciLock, &oldIrql);
-       WRITE_PORT_UCHAR((PUCHAR)0xCF8, FUNC(Slot));
+       WRITE_PORT_UCHAR((PUCHAR)0xCF8, (UCHAR)FUNC(Slot));
        WRITE_PORT_UCHAR((PUCHAR)0xCFA, Bus);
        WRITE_PORT_ULONG((PULONG)(IOADDR(Slot, Offset)), Value);
        WRITE_PORT_UCHAR((PUCHAR)0xCF8, 0);
@@ -290,8 +290,8 @@ HalpGetPciData(PBUS_HANDLER BusHandler,
    if ((Length == 0) || (BusConfigType == 0))
      return 0;
 
-   ReadPciConfigUlong(BusNumber,
-                     SlotNumber & 0x1F,
+   ReadPciConfigUlong((UCHAR)BusNumber,
+                     (UCHAR)(SlotNumber & 0x1F),
                      0x00,
                      &Vendor);
    /* some broken boards return 0 if a slot is empty: */
@@ -306,8 +306,8 @@ HalpGetPciData(PBUS_HANDLER BusHandler,
    }
 
    /* 0E=PCI_HEADER_TYPE */
-   ReadPciConfigUchar(BusNumber,
-                     SlotNumber & 0x1F,
+   ReadPciConfigUchar((UCHAR)BusNumber,
+                     (UCHAR)(SlotNumber & 0x1F),
                      0x0E,
                      &HeaderType);
    if (((HeaderType & PCI_MULTIFUNCTION) == 0) && ((SlotNumber & 0xE0) != 0))
@@ -319,8 +319,8 @@ HalpGetPciData(PBUS_HANDLER BusHandler,
      }
      return 0;
    }
-   ReadPciConfigUlong(BusNumber,
-                     SlotNumber,
+   ReadPciConfigUlong((UCHAR)BusNumber,
+                     (UCHAR)SlotNumber,
                      0x00,
                      &Vendor);
    /* some broken boards return 0 if a slot is empty: */
@@ -336,55 +336,55 @@ HalpGetPciData(PBUS_HANDLER BusHandler,
 
    if ((Address & 1) && (Len >= 1))
      {
-       ReadPciConfigUchar(BusNumber,
-                          SlotNumber,
-                          Address,
+       ReadPciConfigUchar((UCHAR)BusNumber,
+                          (UCHAR)SlotNumber,
+                          (UCHAR)Address,
                           Ptr);
-       Ptr = Ptr + 1;
+       Ptr = (char*)Ptr + 1;
        Address++;
        Len--;
      }
 
    if ((Address & 2) && (Len >= 2))
      {
-       ReadPciConfigUshort(BusNumber,
-                           SlotNumber,
-                           Address,
+       ReadPciConfigUshort((UCHAR)BusNumber,
+                           (UCHAR)SlotNumber,
+                           (UCHAR)Address,
                            Ptr);
-       Ptr = Ptr + 2;
+       Ptr = (char*)Ptr + 2;
        Address += 2;
        Len -= 2;
      }
 
    while (Len >= 4)
      {
-       ReadPciConfigUlong(BusNumber,
-                          SlotNumber,
-                          Address,
+       ReadPciConfigUlong((UCHAR)BusNumber,
+                          (UCHAR)SlotNumber,
+                          (UCHAR)Address,
                           Ptr);
-       Ptr = Ptr + 4;
+       Ptr = (char*)Ptr + 4;
        Address += 4;
        Len -= 4;
      }
 
    if (Len >= 2)
      {
-       ReadPciConfigUshort(BusNumber,
-                           SlotNumber,
-                           Address,
+       ReadPciConfigUshort((UCHAR)BusNumber,
+                           (UCHAR)SlotNumber,
+                           (UCHAR)Address,
                            Ptr);
-       Ptr = Ptr + 2;
+       Ptr = (char*)Ptr + 2;
        Address += 2;
        Len -= 2;
      }
 
    if (Len >= 1)
      {
-       ReadPciConfigUchar(BusNumber,
-                          SlotNumber,
-                          Address,
+       ReadPciConfigUchar((UCHAR)BusNumber,
+                          (UCHAR)SlotNumber,
+                          (UCHAR)Address,
                           Ptr);
-       Ptr = Ptr + 1;
+       Ptr = (char*)Ptr + 1;
        Address++;
        Len--;
      }
@@ -416,8 +416,8 @@ HalpSetPciData(PBUS_HANDLER BusHandler,
    if ((Length == 0) || (BusConfigType == 0))
      return 0;
 
-   ReadPciConfigUlong(BusNumber,
-                     SlotNumber & 0x1F,
+   ReadPciConfigUlong((UCHAR)BusNumber,
+                     (UCHAR)(SlotNumber & 0x1F),
                      0x00,
                      &Vendor);
    /* some broken boards return 0 if a slot is empty: */
@@ -426,15 +426,15 @@ HalpSetPciData(PBUS_HANDLER BusHandler,
 
 
    /* 0E=PCI_HEADER_TYPE */
-   ReadPciConfigUchar(BusNumber,
-                     SlotNumber & 0x1F,
+   ReadPciConfigUchar((UCHAR)BusNumber,
+                     (UCHAR)(SlotNumber & 0x1F),
                      0x0E,
                      &HeaderType);
    if (((HeaderType & PCI_MULTIFUNCTION) == 0) && ((SlotNumber & 0xE0) != 0))
      return 0;
 
-   ReadPciConfigUlong(BusNumber,
-                     SlotNumber,
+   ReadPciConfigUlong((UCHAR)BusNumber,
+                     (UCHAR)SlotNumber,
                      0x00,
                      &Vendor);
    /* some broken boards return 0 if a slot is empty: */
@@ -443,55 +443,55 @@ HalpSetPciData(PBUS_HANDLER BusHandler,
 
    if ((Address & 1) && (Len >= 1))
      {
-       WritePciConfigUchar(BusNumber,
-                           SlotNumber,
-                           Address,
+       WritePciConfigUchar((UCHAR)BusNumber,
+                           (UCHAR)SlotNumber,
+                           (UCHAR)Address,
                            *(PUCHAR)Ptr);
-       Ptr = Ptr + 1;
+       Ptr = (char*)Ptr + 1;
        Address++;
        Len--;
      }
 
    if ((Address & 2) && (Len >= 2))
      {
-       WritePciConfigUshort(BusNumber,
-                            SlotNumber,
-                            Address,
+       WritePciConfigUshort((UCHAR)BusNumber,
+                            (UCHAR)SlotNumber,
+                            (UCHAR)Address,
                             *(PUSHORT)Ptr);
-       Ptr = Ptr + 2;
+       Ptr = (char*)Ptr + 2;
        Address += 2;
        Len -= 2;
      }
 
    while (Len >= 4)
      {
-       WritePciConfigUlong(BusNumber,
-                           SlotNumber,
-                           Address,
+       WritePciConfigUlong((UCHAR)BusNumber,
+                           (UCHAR)SlotNumber,
+                           (UCHAR)Address,
                            *(PULONG)Ptr);
-       Ptr = Ptr + 4;
+       Ptr = (char*)Ptr + 4;
        Address += 4;
        Len -= 4;
      }
 
    if (Len >= 2)
      {
-       WritePciConfigUshort(BusNumber,
-                            SlotNumber,
-                            Address,
+       WritePciConfigUshort((UCHAR)BusNumber,
+                            (UCHAR)SlotNumber,
+                            (UCHAR)Address,
                             *(PUSHORT)Ptr);
-       Ptr = Ptr + 2;
+       Ptr = (char*)Ptr + 2;
        Address += 2;
        Len -= 2;
      }
 
    if (Len >= 1)
      {
-       WritePciConfigUchar(BusNumber,
-                           SlotNumber,
-                           Address,
+       WritePciConfigUchar((UCHAR)BusNumber,
+                           (UCHAR)SlotNumber,
+                           (UCHAR)Address,
                            *(PUCHAR)Ptr);
-       Ptr = Ptr + 1;
+       Ptr = (char*)Ptr + 1;
        Address++;
        Len--;
      }
@@ -552,11 +552,11 @@ HalpGetPciInterruptVector(PVOID BusHandler,
                          PKAFFINITY Affinity)
 {
 #ifdef MP
-  *Irql = PROFILE_LEVEL - BusInterruptVector;
+  *Irql = (KIRQL)(PROFILE_LEVEL - BusInterruptVector);
   *Affinity = 0xFFFFFFFF;
   return IRQ2VECTOR(BusInterruptVector);
 #else
-  *Irql = PROFILE_LEVEL - BusInterruptVector;
+  *Irql = (KIRQL)(PROFILE_LEVEL - BusInterruptVector);
   *Affinity = 0xFFFFFFFF;
   return BusInterruptVector;
 #endif
@@ -611,9 +611,10 @@ HalpAssignPciSlotResources(IN PBUS_HANDLER BusHandler,
                           IN ULONG SlotNumber,
                           IN OUT PCM_RESOURCE_LIST *AllocatedResources)
 {
+  ULONG DataSize;
+  PCI_COMMON_CONFIG PciConfig;
   UINT Address;
-  UINT NoAddresses;
-  ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
+  UINT ResourceCount;
   ULONG Size[PCI_TYPE0_ADDRESSES];
   NTSTATUS Status = STATUS_SUCCESS;
   UCHAR Offset;
@@ -621,97 +622,121 @@ HalpAssignPciSlotResources(IN PBUS_HANDLER BusHandler,
 
   /* FIXME: Should handle 64-bit addresses */
 
+  DataSize = HalpGetPciData(BusHandler,
+                            BusNumber,
+                            SlotNumber,
+                            &PciConfig,
+                            0,
+                            PCI_COMMON_HDR_LENGTH);
+  if (PCI_COMMON_HDR_LENGTH != DataSize)
+    {
+      return STATUS_UNSUCCESSFUL;
+    }
+
   /* Read the PCI configuration space for the device and store base address and
      size information in temporary storage. Count the number of valid base addresses */
-  NoAddresses = 0;
+  ResourceCount = 0;
   for (Address = 0; Address < PCI_TYPE0_ADDRESSES; Address++)
     {
-      Offset = offsetof(PCI_COMMON_CONFIG, u.type0.BaseAddresses[Address]);
-      Status = ReadPciConfigUlong(BusNumber, SlotNumber,
-                                  Offset, BaseAddresses + Address);
-      if (! NT_SUCCESS(Status))
+      if (0xffffffff == PciConfig.u.type0.BaseAddresses[Address])
        {
-         return Status;
+         PciConfig.u.type0.BaseAddresses[Address] = 0;
        }
-      if (0xffffffff == BaseAddresses[Address])
+      if (0 != PciConfig.u.type0.BaseAddresses[Address])
        {
-         BaseAddresses[Address] = 0;
-       }
-      if (0 != BaseAddresses[Address])
-       {
-         NoAddresses++;
-         Status = WritePciConfigUlong(BusNumber, SlotNumber, Offset, 0xffffffff);
+         ResourceCount++;
+          Offset = offsetof(PCI_COMMON_CONFIG, u.type0.BaseAddresses[Address]);
+         Status = WritePciConfigUlong((UCHAR)BusNumber, (UCHAR)SlotNumber, Offset, 0xffffffff);
          if (! NT_SUCCESS(Status))
            {
-             WritePciConfigUlong(BusNumber, SlotNumber, Offset, BaseAddresses[Address]);
+             WritePciConfigUlong((UCHAR)BusNumber, (UCHAR)SlotNumber, Offset,
+                                  PciConfig.u.type0.BaseAddresses[Address]);
              return Status;
            }
-         Status = ReadPciConfigUlong(BusNumber, SlotNumber,
+         Status = ReadPciConfigUlong((UCHAR)BusNumber, (UCHAR)SlotNumber,
                                      Offset, Size + Address);
          if (! NT_SUCCESS(Status))
            {
-             WritePciConfigUlong(BusNumber, SlotNumber, Offset, BaseAddresses[Address]);
+             WritePciConfigUlong((UCHAR)BusNumber, (UCHAR)SlotNumber, Offset,
+                                  PciConfig.u.type0.BaseAddresses[Address]);
              return Status;
            }
-         Status = WritePciConfigUlong(BusNumber, SlotNumber, Offset, BaseAddresses[Address]);
+         Status = WritePciConfigUlong((UCHAR)BusNumber, (UCHAR)SlotNumber, Offset,
+                                       PciConfig.u.type0.BaseAddresses[Address]);
          if (! NT_SUCCESS(Status))
            {
              return Status;
            }
-
        }
     }
 
+  if (0 != PciConfig.u.type0.InterruptLine)
+    {
+      ResourceCount++;
+    }
+
   /* Allocate output buffer and initialize */
   *AllocatedResources = ExAllocatePoolWithTag(PagedPool,
                                               sizeof(CM_RESOURCE_LIST) +
-                                              (NoAddresses - 1) * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR),
+                                              (ResourceCount - 1) * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR),
                                               TAG_PCI);
   if (NULL == *AllocatedResources)
     {
-    return STATUS_NO_MEMORY;
+      return STATUS_NO_MEMORY;
     }
   (*AllocatedResources)->Count = 1;
   (*AllocatedResources)->List[0].InterfaceType = PCIBus;
   (*AllocatedResources)->List[0].BusNumber = BusNumber;
   (*AllocatedResources)->List[0].PartialResourceList.Version = 1;
   (*AllocatedResources)->List[0].PartialResourceList.Revision = 1;
-  (*AllocatedResources)->List[0].PartialResourceList.Count = NoAddresses;
+  (*AllocatedResources)->List[0].PartialResourceList.Count = ResourceCount;
   Descriptor = (*AllocatedResources)->List[0].PartialResourceList.PartialDescriptors;
 
   /* Store configuration information */
   for (Address = 0; Address < PCI_TYPE0_ADDRESSES; Address++)
     {
-      if (0 != BaseAddresses[Address])
+      if (0 != PciConfig.u.type0.BaseAddresses[Address])
        {
          if (PCI_BASE_ADDRESS_SPACE_MEMORY ==
-              (BaseAddresses[Address] & PCI_BASE_ADDRESS_SPACE))
+              (PciConfig.u.type0.BaseAddresses[Address] & PCI_BASE_ADDRESS_SPACE))
            {
              Descriptor->Type = CmResourceTypeMemory;
              Descriptor->ShareDisposition = CmResourceShareDeviceExclusive; /* FIXME I have no idea... */
              Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE;             /* FIXME Just a guess */
-             Descriptor->u.Memory.Start.QuadPart = (BaseAddresses[Address] & PCI_BASE_ADDRESS_MEM_MASK);
+             Descriptor->u.Memory.Start.QuadPart = (PciConfig.u.type0.BaseAddresses[Address] & PCI_BASE_ADDRESS_MEM_MASK);
              Descriptor->u.Memory.Length = PciSize(Size[Address], PCI_BASE_ADDRESS_MEM_MASK);
            }
          else if (PCI_BASE_ADDRESS_SPACE_IO ==
-                   (BaseAddresses[Address] & PCI_BASE_ADDRESS_SPACE))
+                   (PciConfig.u.type0.BaseAddresses[Address] & PCI_BASE_ADDRESS_SPACE))
            {
              Descriptor->Type = CmResourceTypePort;
              Descriptor->ShareDisposition = CmResourceShareDeviceExclusive; /* FIXME I have no idea... */
              Descriptor->Flags = CM_RESOURCE_PORT_IO;                       /* FIXME Just a guess */
-             Descriptor->u.Port.Start.QuadPart = BaseAddresses[Address] &= PCI_BASE_ADDRESS_IO_MASK;
+             Descriptor->u.Port.Start.QuadPart = PciConfig.u.type0.BaseAddresses[Address] &= PCI_BASE_ADDRESS_IO_MASK;
              Descriptor->u.Port.Length = PciSize(Size[Address], PCI_BASE_ADDRESS_IO_MASK & 0xffff);
            }
          else
            {
-             assert(FALSE);
+             ASSERT(FALSE);
              return STATUS_UNSUCCESSFUL;
            }
          Descriptor++;
        }
     }
 
-  assert(Descriptor == (*AllocatedResources)->List[0].PartialResourceList.PartialDescriptors + NoAddresses);
+  if (0 != PciConfig.u.type0.InterruptLine)
+    {
+      Descriptor->Type = CmResourceTypeInterrupt;
+      Descriptor->ShareDisposition = CmResourceShareShared;          /* FIXME Just a guess */
+      Descriptor->Flags = CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE;     /* FIXME Just a guess */
+      Descriptor->u.Interrupt.Level = PciConfig.u.type0.InterruptLine;
+      Descriptor->u.Interrupt.Vector = PciConfig.u.type0.InterruptLine;
+      Descriptor->u.Interrupt.Affinity = 0xFFFFFFFF;
+
+      Descriptor++;
+    }
+
+  ASSERT(Descriptor == (*AllocatedResources)->List[0].PartialResourceList.PartialDescriptors + ResourceCount);
 
   /* FIXME: Should store the resources in the registry resource map */