diff options
-rw-r--r-- | drivers/char/agp/intel-agp.c | 73 |
1 files changed, 44 insertions, 29 deletions
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c index b5cb192dc6b6..cc494abe195e 100644 --- a/drivers/char/agp/intel-agp.c +++ b/drivers/char/agp/intel-agp.c | |||
@@ -812,6 +812,41 @@ static const struct intel_driver_description { | |||
812 | { 0, 0, NULL, NULL, NULL } | 812 | { 0, 0, NULL, NULL, NULL } |
813 | }; | 813 | }; |
814 | 814 | ||
815 | static int __devinit intel_gmch_probe(struct pci_dev *pdev, | ||
816 | struct agp_bridge_data *bridge) | ||
817 | { | ||
818 | int i; | ||
819 | bridge->driver = NULL; | ||
820 | |||
821 | for (i = 0; intel_agp_chipsets[i].name != NULL; i++) { | ||
822 | if ((intel_agp_chipsets[i].gmch_chip_id != 0) && | ||
823 | find_gmch(intel_agp_chipsets[i].gmch_chip_id)) { | ||
824 | bridge->driver = | ||
825 | intel_agp_chipsets[i].gmch_driver; | ||
826 | break; | ||
827 | } | ||
828 | } | ||
829 | |||
830 | if (!bridge->driver) | ||
831 | return 0; | ||
832 | |||
833 | bridge->dev_private_data = &intel_private; | ||
834 | bridge->dev = pdev; | ||
835 | |||
836 | dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name); | ||
837 | |||
838 | if (bridge->driver->mask_memory == intel_i965_mask_memory) { | ||
839 | if (pci_set_dma_mask(intel_private.pcidev, DMA_BIT_MASK(36))) | ||
840 | dev_err(&intel_private.pcidev->dev, | ||
841 | "set gfx device dma mask 36bit failed!\n"); | ||
842 | else | ||
843 | pci_set_consistent_dma_mask(intel_private.pcidev, | ||
844 | DMA_BIT_MASK(36)); | ||
845 | } | ||
846 | |||
847 | return 1; | ||
848 | } | ||
849 | |||
815 | static int __devinit agp_intel_probe(struct pci_dev *pdev, | 850 | static int __devinit agp_intel_probe(struct pci_dev *pdev, |
816 | const struct pci_device_id *ent) | 851 | const struct pci_device_id *ent) |
817 | { | 852 | { |
@@ -826,20 +861,18 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev, | |||
826 | if (!bridge) | 861 | if (!bridge) |
827 | return -ENOMEM; | 862 | return -ENOMEM; |
828 | 863 | ||
864 | bridge->capndx = cap_ptr; | ||
865 | |||
866 | if (intel_gmch_probe(pdev, bridge)) | ||
867 | goto found_gmch; | ||
868 | |||
829 | for (i = 0; intel_agp_chipsets[i].name != NULL; i++) { | 869 | for (i = 0; intel_agp_chipsets[i].name != NULL; i++) { |
830 | /* In case that multiple models of gfx chip may | 870 | /* In case that multiple models of gfx chip may |
831 | stand on same host bridge type, this can be | 871 | stand on same host bridge type, this can be |
832 | sure we detect the right IGD. */ | 872 | sure we detect the right IGD. */ |
833 | if (pdev->device == intel_agp_chipsets[i].chip_id) { | 873 | if (pdev->device == intel_agp_chipsets[i].chip_id) { |
834 | if ((intel_agp_chipsets[i].gmch_chip_id != 0) && | 874 | bridge->driver = intel_agp_chipsets[i].driver; |
835 | find_gmch(intel_agp_chipsets[i].gmch_chip_id)) { | 875 | break; |
836 | bridge->driver = | ||
837 | intel_agp_chipsets[i].gmch_driver; | ||
838 | break; | ||
839 | } else { | ||
840 | bridge->driver = intel_agp_chipsets[i].driver; | ||
841 | break; | ||
842 | } | ||
843 | } | 876 | } |
844 | } | 877 | } |
845 | 878 | ||
@@ -851,18 +884,8 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev, | |||
851 | return -ENODEV; | 884 | return -ENODEV; |
852 | } | 885 | } |
853 | 886 | ||
854 | if (bridge->driver == NULL) { | ||
855 | /* bridge has no AGP and no IGD detected */ | ||
856 | if (cap_ptr) | ||
857 | dev_warn(&pdev->dev, "can't find bridge device (chip_id: %04x)\n", | ||
858 | intel_agp_chipsets[i].gmch_chip_id); | ||
859 | agp_put_bridge(bridge); | ||
860 | return -ENODEV; | ||
861 | } | ||
862 | |||
863 | bridge->dev = pdev; | 887 | bridge->dev = pdev; |
864 | bridge->capndx = cap_ptr; | 888 | bridge->dev_private_data = NULL; |
865 | bridge->dev_private_data = &intel_private; | ||
866 | 889 | ||
867 | dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name); | 890 | dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name); |
868 | 891 | ||
@@ -898,15 +921,7 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev, | |||
898 | &bridge->mode); | 921 | &bridge->mode); |
899 | } | 922 | } |
900 | 923 | ||
901 | if (bridge->driver->mask_memory == intel_i965_mask_memory) { | 924 | found_gmch: |
902 | if (pci_set_dma_mask(intel_private.pcidev, DMA_BIT_MASK(36))) | ||
903 | dev_err(&intel_private.pcidev->dev, | ||
904 | "set gfx device dma mask 36bit failed!\n"); | ||
905 | else | ||
906 | pci_set_consistent_dma_mask(intel_private.pcidev, | ||
907 | DMA_BIT_MASK(36)); | ||
908 | } | ||
909 | |||
910 | pci_set_drvdata(pdev, bridge); | 925 | pci_set_drvdata(pdev, bridge); |
911 | err = agp_add_bridge(bridge); | 926 | err = agp_add_bridge(bridge); |
912 | if (!err) | 927 | if (!err) |