| /* |
| * This file is part of i915tool |
| * |
| * Copyright (C) 2012 The ChromiumOS Authors. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| */ |
| |
| #include "video.h" |
| |
| int find_idlist(struct drm_device *dev, u16 vendor, u16 device) |
| { |
| extern const struct pci_device_id pciidlist[]; |
| int succ = 0; |
| int i; |
| for(i = 0; pciidlist[i].vendor && !succ; i++){ |
| if (vendor == pciidlist[i].vendor && device == |
| pciidlist[i].device){ |
| dev->dev_private->info = |
| (void *)(pciidlist[i].driver_data); |
| succ = 1; |
| } |
| } |
| return succ; |
| } |
| |
| /* there's only going to be one device ... */ |
| int pci_dev_find(struct drm_device *dev) |
| { |
| struct pci_access *pacc = NULL; |
| struct pci_dev *temp; |
| int succ = 0; |
| pacc = pci_alloc(); |
| if (! pacc) |
| return 0; |
| pci_init(pacc); |
| pci_scan_bus(pacc); |
| |
| for (temp = pacc->devices; temp && ! dev->pdev; temp = temp->next){ |
| if ((temp->device_class & 0xff00) == PCI_CLASS_DISPLAY_VGA ) { |
| pci_fill_info(temp, PCI_FILL_IDENT | |
| PCI_FILL_BASES | PCI_FILL_CLASS); |
| dev->pdev = temp; |
| } |
| } |
| |
| if (dev->pdev) |
| succ = find_idlist(dev, dev->pdev->vendor_id, |
| dev->pdev->device_id); |
| return succ; |
| } |
| |
| /* Support library for kernel style pci functions. We could do a semantic |
| * patch for it but this is easier to debug as we can fill it with prints |
| * if we want. And no cpp abuse here. Keep it simple. |
| */ |
| |
| void pci_read_config_byte(struct pci_dev *dev, unsigned long offset, u8 *val) |
| { |
| *val = pci_read_byte(dev, offset); |
| } |
| |
| void pci_write_config_byte(struct pci_dev *dev, unsigned long offset, u8 val) |
| { |
| pci_write_byte(dev, offset, val); |
| } |
| |
| void pci_read_config_word(struct pci_dev *dev, unsigned long offset, u16 *val) |
| { |
| *val = pci_read_word(dev, offset); |
| } |
| |
| void pci_write_config_word(struct pci_dev *dev, unsigned long offset, u16 val) |
| { |
| pci_write_word(dev, offset, val); |
| } |
| |
| void pci_read_config_dword(struct pci_dev *dev, unsigned long offset, u32 *val) |
| { |
| *val = pci_read_long(dev, offset); |
| } |
| |
| void pci_write_config_dword(struct pci_dev *dev, unsigned long offset, u32 val) |
| { |
| pci_write_long(dev, offset, val); |
| } |