LCOV - code coverage report
Current view: top level - drivers/pci - vgaarb.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 8 462 1.7 %
Date: 2023-08-24 13:40:31 Functions: 1 26 3.8 %

          Line data    Source code
       1             : // SPDX-License-Identifier: MIT
       2             : /*
       3             :  * vgaarb.c: Implements the VGA arbitration. For details refer to
       4             :  * Documentation/gpu/vgaarbiter.rst
       5             :  *
       6             :  * (C) Copyright 2005 Benjamin Herrenschmidt <benh@kernel.crashing.org>
       7             :  * (C) Copyright 2007 Paulo R. Zanoni <przanoni@gmail.com>
       8             :  * (C) Copyright 2007, 2009 Tiago Vignatti <vignatti@freedesktop.org>
       9             :  */
      10             : 
      11             : #define pr_fmt(fmt) "vgaarb: " fmt
      12             : 
      13             : #define vgaarb_dbg(dev, fmt, arg...)    dev_dbg(dev, "vgaarb: " fmt, ##arg)
      14             : #define vgaarb_info(dev, fmt, arg...)   dev_info(dev, "vgaarb: " fmt, ##arg)
      15             : #define vgaarb_err(dev, fmt, arg...)    dev_err(dev, "vgaarb: " fmt, ##arg)
      16             : 
      17             : #include <linux/module.h>
      18             : #include <linux/kernel.h>
      19             : #include <linux/pci.h>
      20             : #include <linux/errno.h>
      21             : #include <linux/init.h>
      22             : #include <linux/list.h>
      23             : #include <linux/sched/signal.h>
      24             : #include <linux/wait.h>
      25             : #include <linux/spinlock.h>
      26             : #include <linux/poll.h>
      27             : #include <linux/miscdevice.h>
      28             : #include <linux/slab.h>
      29             : #include <linux/screen_info.h>
      30             : #include <linux/vt.h>
      31             : #include <linux/console.h>
      32             : #include <linux/acpi.h>
      33             : 
      34             : #include <linux/uaccess.h>
      35             : 
      36             : #include <linux/vgaarb.h>
      37             : 
      38             : static void vga_arbiter_notify_clients(void);
      39             : /*
      40             :  * We keep a list of all vga devices in the system to speed
      41             :  * up the various operations of the arbiter
      42             :  */
      43             : struct vga_device {
      44             :         struct list_head list;
      45             :         struct pci_dev *pdev;
      46             :         unsigned int decodes;   /* what does it decodes */
      47             :         unsigned int owns;      /* what does it owns */
      48             :         unsigned int locks;     /* what does it locks */
      49             :         unsigned int io_lock_cnt;       /* legacy IO lock count */
      50             :         unsigned int mem_lock_cnt;      /* legacy MEM lock count */
      51             :         unsigned int io_norm_cnt;       /* normal IO count */
      52             :         unsigned int mem_norm_cnt;      /* normal MEM count */
      53             :         bool bridge_has_one_vga;
      54             :         bool is_firmware_default;       /* device selected by firmware */
      55             :         unsigned int (*set_decode)(struct pci_dev *pdev, bool decode);
      56             : };
      57             : 
      58             : static LIST_HEAD(vga_list);
      59             : static int vga_count, vga_decode_count;
      60             : static bool vga_arbiter_used;
      61             : static DEFINE_SPINLOCK(vga_lock);
      62             : static DECLARE_WAIT_QUEUE_HEAD(vga_wait_queue);
      63             : 
      64             : 
      65             : static const char *vga_iostate_to_str(unsigned int iostate)
      66             : {
      67             :         /* Ignore VGA_RSRC_IO and VGA_RSRC_MEM */
      68           0 :         iostate &= VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM;
      69             :         switch (iostate) {
      70             :         case VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM:
      71             :                 return "io+mem";
      72             :         case VGA_RSRC_LEGACY_IO:
      73             :                 return "io";
      74             :         case VGA_RSRC_LEGACY_MEM:
      75             :                 return "mem";
      76             :         }
      77             :         return "none";
      78             : }
      79             : 
      80           0 : static int vga_str_to_iostate(char *buf, int str_size, int *io_state)
      81             : {
      82             :         /* we could in theory hand out locks on IO and mem
      83             :          * separately to userspace but it can cause deadlocks */
      84           0 :         if (strncmp(buf, "none", 4) == 0) {
      85           0 :                 *io_state = VGA_RSRC_NONE;
      86             :                 return 1;
      87             :         }
      88             : 
      89             :         /* XXX We're not chekcing the str_size! */
      90           0 :         if (strncmp(buf, "io+mem", 6) == 0)
      91             :                 goto both;
      92           0 :         else if (strncmp(buf, "io", 2) == 0)
      93             :                 goto both;
      94           0 :         else if (strncmp(buf, "mem", 3) == 0)
      95             :                 goto both;
      96             :         return 0;
      97             : both:
      98           0 :         *io_state = VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM;
      99             :         return 1;
     100             : }
     101             : 
     102             : /* this is only used a cookie - it should not be dereferenced */
     103             : static struct pci_dev *vga_default;
     104             : 
     105             : /* Find somebody in our list */
     106             : static struct vga_device *vgadev_find(struct pci_dev *pdev)
     107             : {
     108             :         struct vga_device *vgadev;
     109             : 
     110           0 :         list_for_each_entry(vgadev, &vga_list, list)
     111           0 :                 if (pdev == vgadev->pdev)
     112             :                         return vgadev;
     113             :         return NULL;
     114             : }
     115             : 
     116             : /**
     117             :  * vga_default_device - return the default VGA device, for vgacon
     118             :  *
     119             :  * This can be defined by the platform. The default implementation
     120             :  * is rather dumb and will probably only work properly on single
     121             :  * vga card setups and/or x86 platforms.
     122             :  *
     123             :  * If your VGA default device is not PCI, you'll have to return
     124             :  * NULL here. In this case, I assume it will not conflict with
     125             :  * any PCI card. If this is not true, I'll have to define two archs
     126             :  * hooks for enabling/disabling the VGA default device if that is
     127             :  * possible. This may be a problem with real _ISA_ VGA cards, in
     128             :  * addition to a PCI one. I don't know at this point how to deal
     129             :  * with that card. Can theirs IOs be disabled at all ? If not, then
     130             :  * I suppose it's a matter of having the proper arch hook telling
     131             :  * us about it, so we basically never allow anybody to succeed a
     132             :  * vga_get()...
     133             :  */
     134           0 : struct pci_dev *vga_default_device(void)
     135             : {
     136           0 :         return vga_default;
     137             : }
     138             : EXPORT_SYMBOL_GPL(vga_default_device);
     139             : 
     140           0 : void vga_set_default_device(struct pci_dev *pdev)
     141             : {
     142           0 :         if (vga_default == pdev)
     143             :                 return;
     144             : 
     145           0 :         pci_dev_put(vga_default);
     146           0 :         vga_default = pci_dev_get(pdev);
     147             : }
     148             : 
     149             : /**
     150             :  * vga_remove_vgacon - deactivete vga console
     151             :  *
     152             :  * Unbind and unregister vgacon in case pdev is the default vga
     153             :  * device.  Can be called by gpu drivers on initialization to make
     154             :  * sure vga register access done by vgacon will not disturb the
     155             :  * device.
     156             :  *
     157             :  * @pdev: pci device.
     158             :  */
     159             : #if !defined(CONFIG_VGA_CONSOLE)
     160           0 : int vga_remove_vgacon(struct pci_dev *pdev)
     161             : {
     162           0 :         return 0;
     163             : }
     164             : #elif !defined(CONFIG_DUMMY_CONSOLE)
     165             : int vga_remove_vgacon(struct pci_dev *pdev)
     166             : {
     167             :         return -ENODEV;
     168             : }
     169             : #else
     170             : int vga_remove_vgacon(struct pci_dev *pdev)
     171             : {
     172             :         int ret = 0;
     173             : 
     174             :         if (pdev != vga_default)
     175             :                 return 0;
     176             :         vgaarb_info(&pdev->dev, "deactivate vga console\n");
     177             : 
     178             :         console_lock();
     179             :         if (con_is_bound(&vga_con))
     180             :                 ret = do_take_over_console(&dummy_con, 0,
     181             :                                            MAX_NR_CONSOLES - 1, 1);
     182             :         if (ret == 0) {
     183             :                 ret = do_unregister_con_driver(&vga_con);
     184             : 
     185             :                 /* Ignore "already unregistered". */
     186             :                 if (ret == -ENODEV)
     187             :                         ret = 0;
     188             :         }
     189             :         console_unlock();
     190             : 
     191             :         return ret;
     192             : }
     193             : #endif
     194             : EXPORT_SYMBOL(vga_remove_vgacon);
     195             : 
     196             : /* If we don't ever use VGA arb we should avoid
     197             :    turning off anything anywhere due to old X servers getting
     198             :    confused about the boot device not being VGA */
     199             : static void vga_check_first_use(void)
     200             : {
     201             :         /* we should inform all GPUs in the system that
     202             :          * VGA arb has occurred and to try and disable resources
     203             :          * if they can */
     204           0 :         if (!vga_arbiter_used) {
     205           0 :                 vga_arbiter_used = true;
     206           0 :                 vga_arbiter_notify_clients();
     207             :         }
     208             : }
     209             : 
     210           0 : static struct vga_device *__vga_tryget(struct vga_device *vgadev,
     211             :                                        unsigned int rsrc)
     212             : {
     213           0 :         struct device *dev = &vgadev->pdev->dev;
     214             :         unsigned int wants, legacy_wants, match;
     215             :         struct vga_device *conflict;
     216             :         unsigned int pci_bits;
     217           0 :         u32 flags = 0;
     218             : 
     219             :         /* Account for "normal" resources to lock. If we decode the legacy,
     220             :          * counterpart, we need to request it as well
     221             :          */
     222           0 :         if ((rsrc & VGA_RSRC_NORMAL_IO) &&
     223           0 :             (vgadev->decodes & VGA_RSRC_LEGACY_IO))
     224           0 :                 rsrc |= VGA_RSRC_LEGACY_IO;
     225           0 :         if ((rsrc & VGA_RSRC_NORMAL_MEM) &&
     226           0 :             (vgadev->decodes & VGA_RSRC_LEGACY_MEM))
     227           0 :                 rsrc |= VGA_RSRC_LEGACY_MEM;
     228             : 
     229             :         vgaarb_dbg(dev, "%s: %d\n", __func__, rsrc);
     230             :         vgaarb_dbg(dev, "%s: owns: %d\n", __func__, vgadev->owns);
     231             : 
     232             :         /* Check what resources we need to acquire */
     233           0 :         wants = rsrc & ~vgadev->owns;
     234             : 
     235             :         /* We already own everything, just mark locked & bye bye */
     236           0 :         if (wants == 0)
     237             :                 goto lock_them;
     238             : 
     239             :         /* We don't need to request a legacy resource, we just enable
     240             :          * appropriate decoding and go
     241             :          */
     242           0 :         legacy_wants = wants & VGA_RSRC_LEGACY_MASK;
     243           0 :         if (legacy_wants == 0)
     244             :                 goto enable_them;
     245             : 
     246             :         /* Ok, we don't, let's find out how we need to kick off */
     247           0 :         list_for_each_entry(conflict, &vga_list, list) {
     248           0 :                 unsigned int lwants = legacy_wants;
     249           0 :                 unsigned int change_bridge = 0;
     250             : 
     251             :                 /* Don't conflict with myself */
     252           0 :                 if (vgadev == conflict)
     253           0 :                         continue;
     254             : 
     255             :                 /* We have a possible conflict. before we go further, we must
     256             :                  * check if we sit on the same bus as the conflicting device.
     257             :                  * if we don't, then we must tie both IO and MEM resources
     258             :                  * together since there is only a single bit controlling
     259             :                  * VGA forwarding on P2P bridges
     260             :                  */
     261           0 :                 if (vgadev->pdev->bus != conflict->pdev->bus) {
     262           0 :                         change_bridge = 1;
     263           0 :                         lwants = VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM;
     264             :                 }
     265             : 
     266             :                 /* Check if the guy has a lock on the resource. If he does,
     267             :                  * return the conflicting entry
     268             :                  */
     269           0 :                 if (conflict->locks & lwants)
     270             :                         return conflict;
     271             : 
     272             :                 /* Ok, now check if it owns the resource we want.  We can
     273             :                  * lock resources that are not decoded, therefore a device
     274             :                  * can own resources it doesn't decode.
     275             :                  */
     276           0 :                 match = lwants & conflict->owns;
     277           0 :                 if (!match)
     278           0 :                         continue;
     279             : 
     280             :                 /* looks like he doesn't have a lock, we can steal
     281             :                  * them from him
     282             :                  */
     283             : 
     284           0 :                 flags = 0;
     285           0 :                 pci_bits = 0;
     286             : 
     287             :                 /* If we can't control legacy resources via the bridge, we
     288             :                  * also need to disable normal decoding.
     289             :                  */
     290           0 :                 if (!conflict->bridge_has_one_vga) {
     291           0 :                         if ((match & conflict->decodes) & VGA_RSRC_LEGACY_MEM)
     292           0 :                                 pci_bits |= PCI_COMMAND_MEMORY;
     293           0 :                         if ((match & conflict->decodes) & VGA_RSRC_LEGACY_IO)
     294           0 :                                 pci_bits |= PCI_COMMAND_IO;
     295             : 
     296           0 :                         if (pci_bits)
     297           0 :                                 flags |= PCI_VGA_STATE_CHANGE_DECODES;
     298             :                 }
     299             : 
     300           0 :                 if (change_bridge)
     301           0 :                         flags |= PCI_VGA_STATE_CHANGE_BRIDGE;
     302             : 
     303           0 :                 pci_set_vga_state(conflict->pdev, false, pci_bits, flags);
     304           0 :                 conflict->owns &= ~match;
     305             : 
     306             :                 /* If we disabled normal decoding, reflect it in owns */
     307           0 :                 if (pci_bits & PCI_COMMAND_MEMORY)
     308           0 :                         conflict->owns &= ~VGA_RSRC_NORMAL_MEM;
     309           0 :                 if (pci_bits & PCI_COMMAND_IO)
     310           0 :                         conflict->owns &= ~VGA_RSRC_NORMAL_IO;
     311             :         }
     312             : 
     313             : enable_them:
     314             :         /* ok dude, we got it, everybody conflicting has been disabled, let's
     315             :          * enable us.  Mark any bits in "owns" regardless of whether we
     316             :          * decoded them.  We can lock resources we don't decode, therefore
     317             :          * we must track them via "owns".
     318             :          */
     319           0 :         flags = 0;
     320           0 :         pci_bits = 0;
     321             : 
     322           0 :         if (!vgadev->bridge_has_one_vga) {
     323           0 :                 flags |= PCI_VGA_STATE_CHANGE_DECODES;
     324           0 :                 if (wants & (VGA_RSRC_LEGACY_MEM|VGA_RSRC_NORMAL_MEM))
     325           0 :                         pci_bits |= PCI_COMMAND_MEMORY;
     326           0 :                 if (wants & (VGA_RSRC_LEGACY_IO|VGA_RSRC_NORMAL_IO))
     327           0 :                         pci_bits |= PCI_COMMAND_IO;
     328             :         }
     329           0 :         if (wants & VGA_RSRC_LEGACY_MASK)
     330           0 :                 flags |= PCI_VGA_STATE_CHANGE_BRIDGE;
     331             : 
     332           0 :         pci_set_vga_state(vgadev->pdev, true, pci_bits, flags);
     333             : 
     334           0 :         vgadev->owns |= wants;
     335             : lock_them:
     336           0 :         vgadev->locks |= (rsrc & VGA_RSRC_LEGACY_MASK);
     337           0 :         if (rsrc & VGA_RSRC_LEGACY_IO)
     338           0 :                 vgadev->io_lock_cnt++;
     339           0 :         if (rsrc & VGA_RSRC_LEGACY_MEM)
     340           0 :                 vgadev->mem_lock_cnt++;
     341           0 :         if (rsrc & VGA_RSRC_NORMAL_IO)
     342           0 :                 vgadev->io_norm_cnt++;
     343           0 :         if (rsrc & VGA_RSRC_NORMAL_MEM)
     344           0 :                 vgadev->mem_norm_cnt++;
     345             : 
     346             :         return NULL;
     347             : }
     348             : 
     349           0 : static void __vga_put(struct vga_device *vgadev, unsigned int rsrc)
     350             : {
     351           0 :         struct device *dev = &vgadev->pdev->dev;
     352           0 :         unsigned int old_locks = vgadev->locks;
     353             : 
     354             :         vgaarb_dbg(dev, "%s\n", __func__);
     355             : 
     356             :         /* Update our counters, and account for equivalent legacy resources
     357             :          * if we decode them
     358             :          */
     359           0 :         if ((rsrc & VGA_RSRC_NORMAL_IO) && vgadev->io_norm_cnt > 0) {
     360           0 :                 vgadev->io_norm_cnt--;
     361           0 :                 if (vgadev->decodes & VGA_RSRC_LEGACY_IO)
     362           0 :                         rsrc |= VGA_RSRC_LEGACY_IO;
     363             :         }
     364           0 :         if ((rsrc & VGA_RSRC_NORMAL_MEM) && vgadev->mem_norm_cnt > 0) {
     365           0 :                 vgadev->mem_norm_cnt--;
     366           0 :                 if (vgadev->decodes & VGA_RSRC_LEGACY_MEM)
     367           0 :                         rsrc |= VGA_RSRC_LEGACY_MEM;
     368             :         }
     369           0 :         if ((rsrc & VGA_RSRC_LEGACY_IO) && vgadev->io_lock_cnt > 0)
     370           0 :                 vgadev->io_lock_cnt--;
     371           0 :         if ((rsrc & VGA_RSRC_LEGACY_MEM) && vgadev->mem_lock_cnt > 0)
     372           0 :                 vgadev->mem_lock_cnt--;
     373             : 
     374             :         /* Just clear lock bits, we do lazy operations so we don't really
     375             :          * have to bother about anything else at this point
     376             :          */
     377           0 :         if (vgadev->io_lock_cnt == 0)
     378           0 :                 vgadev->locks &= ~VGA_RSRC_LEGACY_IO;
     379           0 :         if (vgadev->mem_lock_cnt == 0)
     380           0 :                 vgadev->locks &= ~VGA_RSRC_LEGACY_MEM;
     381             : 
     382             :         /* Kick the wait queue in case somebody was waiting if we actually
     383             :          * released something
     384             :          */
     385           0 :         if (old_locks != vgadev->locks)
     386           0 :                 wake_up_all(&vga_wait_queue);
     387           0 : }
     388             : 
     389             : /**
     390             :  * vga_get - acquire & locks VGA resources
     391             :  * @pdev: pci device of the VGA card or NULL for the system default
     392             :  * @rsrc: bit mask of resources to acquire and lock
     393             :  * @interruptible: blocking should be interruptible by signals ?
     394             :  *
     395             :  * This function acquires VGA resources for the given card and mark those
     396             :  * resources locked. If the resource requested are "normal" (and not legacy)
     397             :  * resources, the arbiter will first check whether the card is doing legacy
     398             :  * decoding for that type of resource. If yes, the lock is "converted" into a
     399             :  * legacy resource lock.
     400             :  *
     401             :  * The arbiter will first look for all VGA cards that might conflict and disable
     402             :  * their IOs and/or Memory access, including VGA forwarding on P2P bridges if
     403             :  * necessary, so that the requested resources can be used. Then, the card is
     404             :  * marked as locking these resources and the IO and/or Memory accesses are
     405             :  * enabled on the card (including VGA forwarding on parent P2P bridges if any).
     406             :  *
     407             :  * This function will block if some conflicting card is already locking one of
     408             :  * the required resources (or any resource on a different bus segment, since P2P
     409             :  * bridges don't differentiate VGA memory and IO afaik). You can indicate
     410             :  * whether this blocking should be interruptible by a signal (for userland
     411             :  * interface) or not.
     412             :  *
     413             :  * Must not be called at interrupt time or in atomic context.  If the card
     414             :  * already owns the resources, the function succeeds.  Nested calls are
     415             :  * supported (a per-resource counter is maintained)
     416             :  *
     417             :  * On success, release the VGA resource again with vga_put().
     418             :  *
     419             :  * Returns:
     420             :  *
     421             :  * 0 on success, negative error code on failure.
     422             :  */
     423           0 : int vga_get(struct pci_dev *pdev, unsigned int rsrc, int interruptible)
     424             : {
     425             :         struct vga_device *vgadev, *conflict;
     426             :         unsigned long flags;
     427             :         wait_queue_entry_t wait;
     428           0 :         int rc = 0;
     429             : 
     430             :         vga_check_first_use();
     431             :         /* The one who calls us should check for this, but lets be sure... */
     432           0 :         if (pdev == NULL)
     433           0 :                 pdev = vga_default_device();
     434           0 :         if (pdev == NULL)
     435             :                 return 0;
     436             : 
     437             :         for (;;) {
     438           0 :                 spin_lock_irqsave(&vga_lock, flags);
     439           0 :                 vgadev = vgadev_find(pdev);
     440           0 :                 if (vgadev == NULL) {
     441           0 :                         spin_unlock_irqrestore(&vga_lock, flags);
     442           0 :                         rc = -ENODEV;
     443           0 :                         break;
     444             :                 }
     445           0 :                 conflict = __vga_tryget(vgadev, rsrc);
     446           0 :                 spin_unlock_irqrestore(&vga_lock, flags);
     447           0 :                 if (conflict == NULL)
     448             :                         break;
     449             : 
     450             : 
     451             :                 /* We have a conflict, we wait until somebody kicks the
     452             :                  * work queue. Currently we have one work queue that we
     453             :                  * kick each time some resources are released, but it would
     454             :                  * be fairly easy to have a per device one so that we only
     455             :                  * need to attach to the conflicting device
     456             :                  */
     457           0 :                 init_waitqueue_entry(&wait, current);
     458           0 :                 add_wait_queue(&vga_wait_queue, &wait);
     459           0 :                 set_current_state(interruptible ?
     460             :                                   TASK_INTERRUPTIBLE :
     461             :                                   TASK_UNINTERRUPTIBLE);
     462           0 :                 if (interruptible && signal_pending(current)) {
     463           0 :                         __set_current_state(TASK_RUNNING);
     464           0 :                         remove_wait_queue(&vga_wait_queue, &wait);
     465           0 :                         rc = -ERESTARTSYS;
     466           0 :                         break;
     467             :                 }
     468           0 :                 schedule();
     469           0 :                 remove_wait_queue(&vga_wait_queue, &wait);
     470             :         }
     471             :         return rc;
     472             : }
     473             : EXPORT_SYMBOL(vga_get);
     474             : 
     475             : /**
     476             :  * vga_tryget - try to acquire & lock legacy VGA resources
     477             :  * @pdev: pci devivce of VGA card or NULL for system default
     478             :  * @rsrc: bit mask of resources to acquire and lock
     479             :  *
     480             :  * This function performs the same operation as vga_get(), but will return an
     481             :  * error (-EBUSY) instead of blocking if the resources are already locked by
     482             :  * another card. It can be called in any context
     483             :  *
     484             :  * On success, release the VGA resource again with vga_put().
     485             :  *
     486             :  * Returns:
     487             :  *
     488             :  * 0 on success, negative error code on failure.
     489             :  */
     490           0 : static int vga_tryget(struct pci_dev *pdev, unsigned int rsrc)
     491             : {
     492             :         struct vga_device *vgadev;
     493             :         unsigned long flags;
     494           0 :         int rc = 0;
     495             : 
     496             :         vga_check_first_use();
     497             : 
     498             :         /* The one who calls us should check for this, but lets be sure... */
     499           0 :         if (pdev == NULL)
     500           0 :                 pdev = vga_default_device();
     501           0 :         if (pdev == NULL)
     502             :                 return 0;
     503           0 :         spin_lock_irqsave(&vga_lock, flags);
     504           0 :         vgadev = vgadev_find(pdev);
     505           0 :         if (vgadev == NULL) {
     506             :                 rc = -ENODEV;
     507             :                 goto bail;
     508             :         }
     509           0 :         if (__vga_tryget(vgadev, rsrc))
     510           0 :                 rc = -EBUSY;
     511             : bail:
     512           0 :         spin_unlock_irqrestore(&vga_lock, flags);
     513           0 :         return rc;
     514             : }
     515             : 
     516             : /**
     517             :  * vga_put - release lock on legacy VGA resources
     518             :  * @pdev: pci device of VGA card or NULL for system default
     519             :  * @rsrc: but mask of resource to release
     520             :  *
     521             :  * This fuction releases resources previously locked by vga_get() or
     522             :  * vga_tryget(). The resources aren't disabled right away, so that a subsequence
     523             :  * vga_get() on the same card will succeed immediately. Resources have a
     524             :  * counter, so locks are only released if the counter reaches 0.
     525             :  */
     526           0 : void vga_put(struct pci_dev *pdev, unsigned int rsrc)
     527             : {
     528             :         struct vga_device *vgadev;
     529             :         unsigned long flags;
     530             : 
     531             :         /* The one who calls us should check for this, but lets be sure... */
     532           0 :         if (pdev == NULL)
     533           0 :                 pdev = vga_default_device();
     534           0 :         if (pdev == NULL)
     535             :                 return;
     536           0 :         spin_lock_irqsave(&vga_lock, flags);
     537           0 :         vgadev = vgadev_find(pdev);
     538           0 :         if (vgadev == NULL)
     539             :                 goto bail;
     540           0 :         __vga_put(vgadev, rsrc);
     541             : bail:
     542             :         spin_unlock_irqrestore(&vga_lock, flags);
     543             : }
     544             : EXPORT_SYMBOL(vga_put);
     545             : 
     546             : static bool vga_is_firmware_default(struct pci_dev *pdev)
     547             : {
     548             : #if defined(CONFIG_X86) || defined(CONFIG_IA64)
     549             :         u64 base = screen_info.lfb_base;
     550             :         u64 size = screen_info.lfb_size;
     551             :         struct resource *r;
     552             :         u64 limit;
     553             : 
     554             :         /* Select the device owning the boot framebuffer if there is one */
     555             : 
     556             :         if (screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE)
     557             :                 base |= (u64)screen_info.ext_lfb_base << 32;
     558             : 
     559             :         limit = base + size;
     560             : 
     561             :         /* Does firmware framebuffer belong to us? */
     562             :         pci_dev_for_each_resource(pdev, r) {
     563             :                 if (resource_type(r) != IORESOURCE_MEM)
     564             :                         continue;
     565             : 
     566             :                 if (!r->start || !r->end)
     567             :                         continue;
     568             : 
     569             :                 if (base < r->start || limit >= r->end)
     570             :                         continue;
     571             : 
     572             :                 return true;
     573             :         }
     574             : #endif
     575             :         return false;
     576             : }
     577             : 
     578             : static bool vga_arb_integrated_gpu(struct device *dev)
     579             : {
     580             : #if defined(CONFIG_ACPI)
     581             :         struct acpi_device *adev = ACPI_COMPANION(dev);
     582             : 
     583             :         return adev && !strcmp(acpi_device_hid(adev), ACPI_VIDEO_HID);
     584             : #else
     585             :         return false;
     586             : #endif
     587             : }
     588             : 
     589             : /*
     590             :  * Return true if vgadev is a better default VGA device than the best one
     591             :  * we've seen so far.
     592             :  */
     593           0 : static bool vga_is_boot_device(struct vga_device *vgadev)
     594             : {
     595           0 :         struct vga_device *boot_vga = vgadev_find(vga_default_device());
     596           0 :         struct pci_dev *pdev = vgadev->pdev;
     597             :         u16 cmd, boot_cmd;
     598             : 
     599             :         /*
     600             :          * We select the default VGA device in this order:
     601             :          *   Firmware framebuffer (see vga_arb_select_default_device())
     602             :          *   Legacy VGA device (owns VGA_RSRC_LEGACY_MASK)
     603             :          *   Non-legacy integrated device (see vga_arb_select_default_device())
     604             :          *   Non-legacy discrete device (see vga_arb_select_default_device())
     605             :          *   Other device (see vga_arb_select_default_device())
     606             :          */
     607             : 
     608             :         /*
     609             :          * We always prefer a firmware default device, so if we've already
     610             :          * found one, there's no need to consider vgadev.
     611             :          */
     612           0 :         if (boot_vga && boot_vga->is_firmware_default)
     613             :                 return false;
     614             : 
     615           0 :         if (vga_is_firmware_default(pdev)) {
     616             :                 vgadev->is_firmware_default = true;
     617             :                 return true;
     618             :         }
     619             : 
     620             :         /*
     621             :          * A legacy VGA device has MEM and IO enabled and any bridges
     622             :          * leading to it have PCI_BRIDGE_CTL_VGA enabled so the legacy
     623             :          * resources ([mem 0xa0000-0xbffff], [io 0x3b0-0x3bb], etc) are
     624             :          * routed to it.
     625             :          *
     626             :          * We use the first one we find, so if we've already found one,
     627             :          * vgadev is no better.
     628             :          */
     629           0 :         if (boot_vga &&
     630           0 :             (boot_vga->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK)
     631             :                 return false;
     632             : 
     633           0 :         if ((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK)
     634             :                 return true;
     635             : 
     636             :         /*
     637             :          * If we haven't found a legacy VGA device, accept a non-legacy
     638             :          * device.  It may have either IO or MEM enabled, and bridges may
     639             :          * not have PCI_BRIDGE_CTL_VGA enabled, so it may not be able to
     640             :          * use legacy VGA resources.  Prefer an integrated GPU over others.
     641             :          */
     642           0 :         pci_read_config_word(pdev, PCI_COMMAND, &cmd);
     643           0 :         if (cmd & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
     644             : 
     645             :                 /*
     646             :                  * An integrated GPU overrides a previous non-legacy
     647             :                  * device.  We expect only a single integrated GPU, but if
     648             :                  * there are more, we use the *last* because that was the
     649             :                  * previous behavior.
     650             :                  */
     651           0 :                 if (vga_arb_integrated_gpu(&pdev->dev))
     652             :                         return true;
     653             : 
     654             :                 /*
     655             :                  * We prefer the first non-legacy discrete device we find.
     656             :                  * If we already found one, vgadev is no better.
     657             :                  */
     658           0 :                 if (boot_vga) {
     659           0 :                         pci_read_config_word(boot_vga->pdev, PCI_COMMAND,
     660             :                                              &boot_cmd);
     661           0 :                         if (boot_cmd & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY))
     662             :                                 return false;
     663             :                 }
     664             :                 return true;
     665             :         }
     666             : 
     667             :         /*
     668             :          * vgadev has neither IO nor MEM enabled.  If we haven't found any
     669             :          * other VGA devices, it is the best candidate so far.
     670             :          */
     671           0 :         if (!boot_vga)
     672             :                 return true;
     673             : 
     674             :         return false;
     675             : }
     676             : 
     677             : /*
     678             :  * Rules for using a bridge to control a VGA descendant decoding: if a bridge
     679             :  * has only one VGA descendant then it can be used to control the VGA routing
     680             :  * for that device. It should always use the bridge closest to the device to
     681             :  * control it. If a bridge has a direct VGA descendant, but also have a sub-
     682             :  * bridge VGA descendant then we cannot use that bridge to control the direct
     683             :  * VGA descendant. So for every device we register, we need to iterate all
     684             :  * its parent bridges so we can invalidate any devices using them properly.
     685             :  */
     686           0 : static void vga_arbiter_check_bridge_sharing(struct vga_device *vgadev)
     687             : {
     688             :         struct vga_device *same_bridge_vgadev;
     689             :         struct pci_bus *new_bus, *bus;
     690             :         struct pci_dev *new_bridge, *bridge;
     691             : 
     692           0 :         vgadev->bridge_has_one_vga = true;
     693             : 
     694           0 :         if (list_empty(&vga_list)) {
     695           0 :                 vgaarb_info(&vgadev->pdev->dev, "bridge control possible\n");
     696             :                 return;
     697             :         }
     698             : 
     699             :         /* okay iterate the new devices bridge hierarachy */
     700           0 :         new_bus = vgadev->pdev->bus;
     701           0 :         while (new_bus) {
     702           0 :                 new_bridge = new_bus->self;
     703             : 
     704             :                 /* go through list of devices already registered */
     705           0 :                 list_for_each_entry(same_bridge_vgadev, &vga_list, list) {
     706           0 :                         bus = same_bridge_vgadev->pdev->bus;
     707           0 :                         bridge = bus->self;
     708             : 
     709             :                         /* see if the share a bridge with this device */
     710           0 :                         if (new_bridge == bridge) {
     711             :                                 /*
     712             :                                  * If their direct parent bridge is the same
     713             :                                  * as any bridge of this device then it can't
     714             :                                  * be used for that device.
     715             :                                  */
     716           0 :                                 same_bridge_vgadev->bridge_has_one_vga = false;
     717             :                         }
     718             : 
     719             :                         /*
     720             :                          * Now iterate the previous devices bridge hierarchy.
     721             :                          * If the new devices parent bridge is in the other
     722             :                          * devices hierarchy then we can't use it to control
     723             :                          * this device
     724             :                          */
     725           0 :                         while (bus) {
     726           0 :                                 bridge = bus->self;
     727             : 
     728           0 :                                 if (bridge && bridge == vgadev->pdev->bus->self)
     729           0 :                                         vgadev->bridge_has_one_vga = false;
     730             : 
     731           0 :                                 bus = bus->parent;
     732             :                         }
     733             :                 }
     734           0 :                 new_bus = new_bus->parent;
     735             :         }
     736             : 
     737           0 :         if (vgadev->bridge_has_one_vga)
     738           0 :                 vgaarb_info(&vgadev->pdev->dev, "bridge control possible\n");
     739             :         else
     740           0 :                 vgaarb_info(&vgadev->pdev->dev, "no bridge control possible\n");
     741             : }
     742             : 
     743             : /*
     744             :  * Currently, we assume that the "initial" setup of the system is
     745             :  * not sane, that is we come up with conflicting devices and let
     746             :  * the arbiter's client decides if devices decodes or not legacy
     747             :  * things.
     748             :  */
     749           0 : static bool vga_arbiter_add_pci_device(struct pci_dev *pdev)
     750             : {
     751             :         struct vga_device *vgadev;
     752             :         unsigned long flags;
     753             :         struct pci_bus *bus;
     754             :         struct pci_dev *bridge;
     755             :         u16 cmd;
     756             : 
     757             :         /* Only deal with VGA class devices */
     758           0 :         if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
     759             :                 return false;
     760             : 
     761             :         /* Allocate structure */
     762           0 :         vgadev = kzalloc(sizeof(struct vga_device), GFP_KERNEL);
     763           0 :         if (vgadev == NULL) {
     764           0 :                 vgaarb_err(&pdev->dev, "failed to allocate VGA arbiter data\n");
     765             :                 /*
     766             :                  * What to do on allocation failure ? For now, let's just do
     767             :                  * nothing, I'm not sure there is anything saner to be done.
     768             :                  */
     769           0 :                 return false;
     770             :         }
     771             : 
     772             :         /* Take lock & check for duplicates */
     773           0 :         spin_lock_irqsave(&vga_lock, flags);
     774           0 :         if (vgadev_find(pdev) != NULL) {
     775           0 :                 BUG_ON(1);
     776             :                 goto fail;
     777             :         }
     778           0 :         vgadev->pdev = pdev;
     779             : 
     780             :         /* By default, assume we decode everything */
     781           0 :         vgadev->decodes = VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM |
     782             :                           VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
     783             : 
     784             :         /* by default mark it as decoding */
     785           0 :         vga_decode_count++;
     786             :         /* Mark that we "own" resources based on our enables, we will
     787             :          * clear that below if the bridge isn't forwarding
     788             :          */
     789           0 :         pci_read_config_word(pdev, PCI_COMMAND, &cmd);
     790           0 :         if (cmd & PCI_COMMAND_IO)
     791           0 :                 vgadev->owns |= VGA_RSRC_LEGACY_IO;
     792           0 :         if (cmd & PCI_COMMAND_MEMORY)
     793           0 :                 vgadev->owns |= VGA_RSRC_LEGACY_MEM;
     794             : 
     795             :         /* Check if VGA cycles can get down to us */
     796           0 :         bus = pdev->bus;
     797           0 :         while (bus) {
     798           0 :                 bridge = bus->self;
     799           0 :                 if (bridge) {
     800             :                         u16 l;
     801             : 
     802           0 :                         pci_read_config_word(bridge, PCI_BRIDGE_CONTROL, &l);
     803           0 :                         if (!(l & PCI_BRIDGE_CTL_VGA)) {
     804           0 :                                 vgadev->owns = 0;
     805           0 :                                 break;
     806             :                         }
     807             :                 }
     808           0 :                 bus = bus->parent;
     809             :         }
     810             : 
     811           0 :         if (vga_is_boot_device(vgadev)) {
     812           0 :                 vgaarb_info(&pdev->dev, "setting as boot VGA device%s\n",
     813             :                             vga_default_device() ?
     814             :                             " (overriding previous)" : "");
     815           0 :                 vga_set_default_device(pdev);
     816             :         }
     817             : 
     818           0 :         vga_arbiter_check_bridge_sharing(vgadev);
     819             : 
     820             :         /* Add to the list */
     821           0 :         list_add_tail(&vgadev->list, &vga_list);
     822           0 :         vga_count++;
     823           0 :         vgaarb_info(&pdev->dev, "VGA device added: decodes=%s,owns=%s,locks=%s\n",
     824             :                 vga_iostate_to_str(vgadev->decodes),
     825             :                 vga_iostate_to_str(vgadev->owns),
     826             :                 vga_iostate_to_str(vgadev->locks));
     827             : 
     828           0 :         spin_unlock_irqrestore(&vga_lock, flags);
     829           0 :         return true;
     830             : fail:
     831             :         spin_unlock_irqrestore(&vga_lock, flags);
     832             :         kfree(vgadev);
     833             :         return false;
     834             : }
     835             : 
     836           0 : static bool vga_arbiter_del_pci_device(struct pci_dev *pdev)
     837             : {
     838             :         struct vga_device *vgadev;
     839             :         unsigned long flags;
     840           0 :         bool ret = true;
     841             : 
     842           0 :         spin_lock_irqsave(&vga_lock, flags);
     843           0 :         vgadev = vgadev_find(pdev);
     844           0 :         if (vgadev == NULL) {
     845             :                 ret = false;
     846             :                 goto bail;
     847             :         }
     848             : 
     849           0 :         if (vga_default == pdev)
     850           0 :                 vga_set_default_device(NULL);
     851             : 
     852           0 :         if (vgadev->decodes & (VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM))
     853           0 :                 vga_decode_count--;
     854             : 
     855             :         /* Remove entry from list */
     856           0 :         list_del(&vgadev->list);
     857           0 :         vga_count--;
     858             : 
     859             :         /* Wake up all possible waiters */
     860           0 :         wake_up_all(&vga_wait_queue);
     861             : bail:
     862           0 :         spin_unlock_irqrestore(&vga_lock, flags);
     863           0 :         kfree(vgadev);
     864           0 :         return ret;
     865             : }
     866             : 
     867             : /* this is called with the lock */
     868           0 : static inline void vga_update_device_decodes(struct vga_device *vgadev,
     869             :                                              int new_decodes)
     870             : {
     871           0 :         struct device *dev = &vgadev->pdev->dev;
     872             :         int old_decodes, decodes_removed, decodes_unlocked;
     873             : 
     874           0 :         old_decodes = vgadev->decodes;
     875           0 :         decodes_removed = ~new_decodes & old_decodes;
     876           0 :         decodes_unlocked = vgadev->locks & decodes_removed;
     877           0 :         vgadev->decodes = new_decodes;
     878             : 
     879           0 :         vgaarb_info(dev, "changed VGA decodes: olddecodes=%s,decodes=%s:owns=%s\n",
     880             :                 vga_iostate_to_str(old_decodes),
     881             :                 vga_iostate_to_str(vgadev->decodes),
     882             :                 vga_iostate_to_str(vgadev->owns));
     883             : 
     884             :         /* if we removed locked decodes, lock count goes to zero, and release */
     885           0 :         if (decodes_unlocked) {
     886           0 :                 if (decodes_unlocked & VGA_RSRC_LEGACY_IO)
     887           0 :                         vgadev->io_lock_cnt = 0;
     888           0 :                 if (decodes_unlocked & VGA_RSRC_LEGACY_MEM)
     889           0 :                         vgadev->mem_lock_cnt = 0;
     890           0 :                 __vga_put(vgadev, decodes_unlocked);
     891             :         }
     892             : 
     893             :         /* change decodes counter */
     894           0 :         if (old_decodes & VGA_RSRC_LEGACY_MASK &&
     895           0 :             !(new_decodes & VGA_RSRC_LEGACY_MASK))
     896           0 :                 vga_decode_count--;
     897           0 :         if (!(old_decodes & VGA_RSRC_LEGACY_MASK) &&
     898           0 :             new_decodes & VGA_RSRC_LEGACY_MASK)
     899           0 :                 vga_decode_count++;
     900             :         vgaarb_dbg(dev, "decoding count now is: %d\n", vga_decode_count);
     901           0 : }
     902             : 
     903           0 : static void __vga_set_legacy_decoding(struct pci_dev *pdev,
     904             :                                       unsigned int decodes,
     905             :                                       bool userspace)
     906             : {
     907             :         struct vga_device *vgadev;
     908             :         unsigned long flags;
     909             : 
     910           0 :         decodes &= VGA_RSRC_LEGACY_MASK;
     911             : 
     912           0 :         spin_lock_irqsave(&vga_lock, flags);
     913           0 :         vgadev = vgadev_find(pdev);
     914           0 :         if (vgadev == NULL)
     915             :                 goto bail;
     916             : 
     917             :         /* don't let userspace futz with kernel driver decodes */
     918           0 :         if (userspace && vgadev->set_decode)
     919             :                 goto bail;
     920             : 
     921             :         /* update the device decodes + counter */
     922           0 :         vga_update_device_decodes(vgadev, decodes);
     923             : 
     924             :         /* XXX if somebody is going from "doesn't decode" to "decodes" state
     925             :          * here, additional care must be taken as we may have pending owner
     926             :          * ship of non-legacy region ...
     927             :          */
     928             : bail:
     929           0 :         spin_unlock_irqrestore(&vga_lock, flags);
     930           0 : }
     931             : 
     932             : /**
     933             :  * vga_set_legacy_decoding
     934             :  * @pdev: pci device of the VGA card
     935             :  * @decodes: bit mask of what legacy regions the card decodes
     936             :  *
     937             :  * Indicates to the arbiter if the card decodes legacy VGA IOs, legacy VGA
     938             :  * Memory, both, or none. All cards default to both, the card driver (fbdev for
     939             :  * example) should tell the arbiter if it has disabled legacy decoding, so the
     940             :  * card can be left out of the arbitration process (and can be safe to take
     941             :  * interrupts at any time.
     942             :  */
     943           0 : void vga_set_legacy_decoding(struct pci_dev *pdev, unsigned int decodes)
     944             : {
     945           0 :         __vga_set_legacy_decoding(pdev, decodes, false);
     946           0 : }
     947             : EXPORT_SYMBOL(vga_set_legacy_decoding);
     948             : 
     949             : /**
     950             :  * vga_client_register - register or unregister a VGA arbitration client
     951             :  * @pdev: pci device of the VGA client
     952             :  * @set_decode: vga decode change callback
     953             :  *
     954             :  * Clients have two callback mechanisms they can use.
     955             :  *
     956             :  * @set_decode callback: If a client can disable its GPU VGA resource, it
     957             :  * will get a callback from this to set the encode/decode state.
     958             :  *
     959             :  * Rationale: we cannot disable VGA decode resources unconditionally some single
     960             :  * GPU laptops seem to require ACPI or BIOS access to the VGA registers to
     961             :  * control things like backlights etc.  Hopefully newer multi-GPU laptops do
     962             :  * something saner, and desktops won't have any special ACPI for this. The
     963             :  * driver will get a callback when VGA arbitration is first used by userspace
     964             :  * since some older X servers have issues.
     965             :  *
     966             :  * This function does not check whether a client for @pdev has been registered
     967             :  * already.
     968             :  *
     969             :  * To unregister just call vga_client_unregister().
     970             :  *
     971             :  * Returns: 0 on success, -1 on failure
     972             :  */
     973           0 : int vga_client_register(struct pci_dev *pdev,
     974             :                 unsigned int (*set_decode)(struct pci_dev *pdev, bool decode))
     975             : {
     976           0 :         int ret = -ENODEV;
     977             :         struct vga_device *vgadev;
     978             :         unsigned long flags;
     979             : 
     980           0 :         spin_lock_irqsave(&vga_lock, flags);
     981           0 :         vgadev = vgadev_find(pdev);
     982           0 :         if (!vgadev)
     983             :                 goto bail;
     984             : 
     985           0 :         vgadev->set_decode = set_decode;
     986           0 :         ret = 0;
     987             : 
     988             : bail:
     989           0 :         spin_unlock_irqrestore(&vga_lock, flags);
     990           0 :         return ret;
     991             : 
     992             : }
     993             : EXPORT_SYMBOL(vga_client_register);
     994             : 
     995             : /*
     996             :  * Char driver implementation
     997             :  *
     998             :  * Semantics is:
     999             :  *
    1000             :  *  open       : open user instance of the arbitrer. by default, it's
    1001             :  *                attached to the default VGA device of the system.
    1002             :  *
    1003             :  *  close      : close user instance, release locks
    1004             :  *
    1005             :  *  read       : return a string indicating the status of the target.
    1006             :  *                an IO state string is of the form {io,mem,io+mem,none},
    1007             :  *                mc and ic are respectively mem and io lock counts (for
    1008             :  *                debugging/diagnostic only). "decodes" indicate what the
    1009             :  *                card currently decodes, "owns" indicates what is currently
    1010             :  *                enabled on it, and "locks" indicates what is locked by this
    1011             :  *                card. If the card is unplugged, we get "invalid" then for
    1012             :  *                card_ID and an -ENODEV error is returned for any command
    1013             :  *                until a new card is targeted
    1014             :  *
    1015             :  *   "<card_ID>,decodes=<io_state>,owns=<io_state>,locks=<io_state> (ic,mc)"
    1016             :  *
    1017             :  * write       : write a command to the arbiter. List of commands is:
    1018             :  *
    1019             :  *   target <card_ID>   : switch target to card <card_ID> (see below)
    1020             :  *   lock <io_state>    : acquires locks on target ("none" is invalid io_state)
    1021             :  *   trylock <io_state> : non-blocking acquire locks on target
    1022             :  *   unlock <io_state>  : release locks on target
    1023             :  *   unlock all         : release all locks on target held by this user
    1024             :  *   decodes <io_state> : set the legacy decoding attributes for the card
    1025             :  *
    1026             :  * poll         : event if something change on any card (not just the target)
    1027             :  *
    1028             :  * card_ID is of the form "PCI:domain:bus:dev.fn". It can be set to "default"
    1029             :  * to go back to the system default card (TODO: not implemented yet).
    1030             :  * Currently, only PCI is supported as a prefix, but the userland API may
    1031             :  * support other bus types in the future, even if the current kernel
    1032             :  * implementation doesn't.
    1033             :  *
    1034             :  * Note about locks:
    1035             :  *
    1036             :  * The driver keeps track of which user has what locks on which card. It
    1037             :  * supports stacking, like the kernel one. This complexifies the implementation
    1038             :  * a bit, but makes the arbiter more tolerant to userspace problems and able
    1039             :  * to properly cleanup in all cases when a process dies.
    1040             :  * Currently, a max of 16 cards simultaneously can have locks issued from
    1041             :  * userspace for a given user (file descriptor instance) of the arbiter.
    1042             :  *
    1043             :  * If the device is hot-unplugged, there is a hook inside the module to notify
    1044             :  * they being added/removed in the system and automatically added/removed in
    1045             :  * the arbiter.
    1046             :  */
    1047             : 
    1048             : #define MAX_USER_CARDS         CONFIG_VGA_ARB_MAX_GPUS
    1049             : #define PCI_INVALID_CARD       ((struct pci_dev *)-1UL)
    1050             : 
    1051             : /*
    1052             :  * Each user has an array of these, tracking which cards have locks
    1053             :  */
    1054             : struct vga_arb_user_card {
    1055             :         struct pci_dev *pdev;
    1056             :         unsigned int mem_cnt;
    1057             :         unsigned int io_cnt;
    1058             : };
    1059             : 
    1060             : struct vga_arb_private {
    1061             :         struct list_head list;
    1062             :         struct pci_dev *target;
    1063             :         struct vga_arb_user_card cards[MAX_USER_CARDS];
    1064             :         spinlock_t lock;
    1065             : };
    1066             : 
    1067             : static LIST_HEAD(vga_user_list);
    1068             : static DEFINE_SPINLOCK(vga_user_lock);
    1069             : 
    1070             : 
    1071             : /*
    1072             :  * This function gets a string in the format: "PCI:domain:bus:dev.fn" and
    1073             :  * returns the respective values. If the string is not in this format,
    1074             :  * it returns 0.
    1075             :  */
    1076           0 : static int vga_pci_str_to_vars(char *buf, int count, unsigned int *domain,
    1077             :                                unsigned int *bus, unsigned int *devfn)
    1078             : {
    1079             :         int n;
    1080             :         unsigned int slot, func;
    1081             : 
    1082             : 
    1083           0 :         n = sscanf(buf, "PCI:%x:%x:%x.%x", domain, bus, &slot, &func);
    1084           0 :         if (n != 4)
    1085             :                 return 0;
    1086             : 
    1087           0 :         *devfn = PCI_DEVFN(slot, func);
    1088             : 
    1089             :         return 1;
    1090             : }
    1091             : 
    1092           0 : static ssize_t vga_arb_read(struct file *file, char __user *buf,
    1093             :                             size_t count, loff_t *ppos)
    1094             : {
    1095           0 :         struct vga_arb_private *priv = file->private_data;
    1096             :         struct vga_device *vgadev;
    1097             :         struct pci_dev *pdev;
    1098             :         unsigned long flags;
    1099             :         size_t len;
    1100             :         int rc;
    1101             :         char *lbuf;
    1102             : 
    1103           0 :         lbuf = kmalloc(1024, GFP_KERNEL);
    1104           0 :         if (lbuf == NULL)
    1105             :                 return -ENOMEM;
    1106             : 
    1107             :         /* Protects vga_list */
    1108           0 :         spin_lock_irqsave(&vga_lock, flags);
    1109             : 
    1110             :         /* If we are targeting the default, use it */
    1111           0 :         pdev = priv->target;
    1112           0 :         if (pdev == NULL || pdev == PCI_INVALID_CARD) {
    1113           0 :                 spin_unlock_irqrestore(&vga_lock, flags);
    1114           0 :                 len = sprintf(lbuf, "invalid");
    1115           0 :                 goto done;
    1116             :         }
    1117             : 
    1118             :         /* Find card vgadev structure */
    1119           0 :         vgadev = vgadev_find(pdev);
    1120           0 :         if (vgadev == NULL) {
    1121             :                 /* Wow, it's not in the list, that shouldn't happen,
    1122             :                  * let's fix us up and return invalid card
    1123             :                  */
    1124           0 :                 spin_unlock_irqrestore(&vga_lock, flags);
    1125           0 :                 len = sprintf(lbuf, "invalid");
    1126           0 :                 goto done;
    1127             :         }
    1128             : 
    1129             :         /* Fill the buffer with infos */
    1130           0 :         len = snprintf(lbuf, 1024,
    1131             :                        "count:%d,PCI:%s,decodes=%s,owns=%s,locks=%s(%u:%u)\n",
    1132             :                        vga_decode_count, pci_name(pdev),
    1133             :                        vga_iostate_to_str(vgadev->decodes),
    1134             :                        vga_iostate_to_str(vgadev->owns),
    1135             :                        vga_iostate_to_str(vgadev->locks),
    1136             :                        vgadev->io_lock_cnt, vgadev->mem_lock_cnt);
    1137             : 
    1138             :         spin_unlock_irqrestore(&vga_lock, flags);
    1139             : done:
    1140             : 
    1141             :         /* Copy that to user */
    1142           0 :         if (len > count)
    1143           0 :                 len = count;
    1144           0 :         rc = copy_to_user(buf, lbuf, len);
    1145           0 :         kfree(lbuf);
    1146           0 :         if (rc)
    1147             :                 return -EFAULT;
    1148           0 :         return len;
    1149             : }
    1150             : 
    1151             : /*
    1152             :  * TODO: To avoid parsing inside kernel and to improve the speed we may
    1153             :  * consider use ioctl here
    1154             :  */
    1155           0 : static ssize_t vga_arb_write(struct file *file, const char __user *buf,
    1156             :                              size_t count, loff_t *ppos)
    1157             : {
    1158           0 :         struct vga_arb_private *priv = file->private_data;
    1159           0 :         struct vga_arb_user_card *uc = NULL;
    1160             :         struct pci_dev *pdev;
    1161             : 
    1162             :         unsigned int io_state;
    1163             : 
    1164             :         char kbuf[64], *curr_pos;
    1165           0 :         size_t remaining = count;
    1166             : 
    1167             :         int ret_val;
    1168             :         int i;
    1169             : 
    1170           0 :         if (count >= sizeof(kbuf))
    1171             :                 return -EINVAL;
    1172           0 :         if (copy_from_user(kbuf, buf, count))
    1173             :                 return -EFAULT;
    1174           0 :         curr_pos = kbuf;
    1175           0 :         kbuf[count] = '\0';     /* Just to make sure... */
    1176             : 
    1177           0 :         if (strncmp(curr_pos, "lock ", 5) == 0) {
    1178           0 :                 curr_pos += 5;
    1179           0 :                 remaining -= 5;
    1180             : 
    1181             :                 pr_debug("client 0x%p called 'lock'\n", priv);
    1182             : 
    1183           0 :                 if (!vga_str_to_iostate(curr_pos, remaining, &io_state)) {
    1184             :                         ret_val = -EPROTO;
    1185             :                         goto done;
    1186             :                 }
    1187           0 :                 if (io_state == VGA_RSRC_NONE) {
    1188             :                         ret_val = -EPROTO;
    1189             :                         goto done;
    1190             :                 }
    1191             : 
    1192           0 :                 pdev = priv->target;
    1193           0 :                 if (priv->target == NULL) {
    1194             :                         ret_val = -ENODEV;
    1195             :                         goto done;
    1196             :                 }
    1197             : 
    1198           0 :                 vga_get_uninterruptible(pdev, io_state);
    1199             : 
    1200             :                 /* Update the client's locks lists... */
    1201           0 :                 for (i = 0; i < MAX_USER_CARDS; i++) {
    1202           0 :                         if (priv->cards[i].pdev == pdev) {
    1203           0 :                                 if (io_state & VGA_RSRC_LEGACY_IO)
    1204           0 :                                         priv->cards[i].io_cnt++;
    1205           0 :                                 if (io_state & VGA_RSRC_LEGACY_MEM)
    1206           0 :                                         priv->cards[i].mem_cnt++;
    1207             :                                 break;
    1208             :                         }
    1209             :                 }
    1210             : 
    1211           0 :                 ret_val = count;
    1212           0 :                 goto done;
    1213           0 :         } else if (strncmp(curr_pos, "unlock ", 7) == 0) {
    1214           0 :                 curr_pos += 7;
    1215           0 :                 remaining -= 7;
    1216             : 
    1217             :                 pr_debug("client 0x%p called 'unlock'\n", priv);
    1218             : 
    1219           0 :                 if (strncmp(curr_pos, "all", 3) == 0)
    1220           0 :                         io_state = VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM;
    1221             :                 else {
    1222           0 :                         if (!vga_str_to_iostate
    1223             :                             (curr_pos, remaining, &io_state)) {
    1224             :                                 ret_val = -EPROTO;
    1225             :                                 goto done;
    1226             :                         }
    1227             :                         /* TODO: Add this?
    1228             :                            if (io_state == VGA_RSRC_NONE) {
    1229             :                            ret_val = -EPROTO;
    1230             :                            goto done;
    1231             :                            }
    1232             :                           */
    1233             :                 }
    1234             : 
    1235           0 :                 pdev = priv->target;
    1236           0 :                 if (priv->target == NULL) {
    1237             :                         ret_val = -ENODEV;
    1238             :                         goto done;
    1239             :                 }
    1240           0 :                 for (i = 0; i < MAX_USER_CARDS; i++) {
    1241           0 :                         if (priv->cards[i].pdev == pdev)
    1242           0 :                                 uc = &priv->cards[i];
    1243             :                 }
    1244             : 
    1245           0 :                 if (!uc) {
    1246             :                         ret_val = -EINVAL;
    1247             :                         goto done;
    1248             :                 }
    1249             : 
    1250           0 :                 if (io_state & VGA_RSRC_LEGACY_IO && uc->io_cnt == 0) {
    1251             :                         ret_val = -EINVAL;
    1252             :                         goto done;
    1253             :                 }
    1254             : 
    1255           0 :                 if (io_state & VGA_RSRC_LEGACY_MEM && uc->mem_cnt == 0) {
    1256             :                         ret_val = -EINVAL;
    1257             :                         goto done;
    1258             :                 }
    1259             : 
    1260           0 :                 vga_put(pdev, io_state);
    1261             : 
    1262           0 :                 if (io_state & VGA_RSRC_LEGACY_IO)
    1263           0 :                         uc->io_cnt--;
    1264           0 :                 if (io_state & VGA_RSRC_LEGACY_MEM)
    1265           0 :                         uc->mem_cnt--;
    1266             : 
    1267           0 :                 ret_val = count;
    1268           0 :                 goto done;
    1269           0 :         } else if (strncmp(curr_pos, "trylock ", 8) == 0) {
    1270           0 :                 curr_pos += 8;
    1271           0 :                 remaining -= 8;
    1272             : 
    1273             :                 pr_debug("client 0x%p called 'trylock'\n", priv);
    1274             : 
    1275           0 :                 if (!vga_str_to_iostate(curr_pos, remaining, &io_state)) {
    1276             :                         ret_val = -EPROTO;
    1277             :                         goto done;
    1278             :                 }
    1279             :                 /* TODO: Add this?
    1280             :                    if (io_state == VGA_RSRC_NONE) {
    1281             :                    ret_val = -EPROTO;
    1282             :                    goto done;
    1283             :                    }
    1284             :                  */
    1285             : 
    1286           0 :                 pdev = priv->target;
    1287           0 :                 if (priv->target == NULL) {
    1288             :                         ret_val = -ENODEV;
    1289             :                         goto done;
    1290             :                 }
    1291             : 
    1292           0 :                 if (vga_tryget(pdev, io_state)) {
    1293             :                         /* Update the client's locks lists... */
    1294           0 :                         for (i = 0; i < MAX_USER_CARDS; i++) {
    1295           0 :                                 if (priv->cards[i].pdev == pdev) {
    1296           0 :                                         if (io_state & VGA_RSRC_LEGACY_IO)
    1297           0 :                                                 priv->cards[i].io_cnt++;
    1298           0 :                                         if (io_state & VGA_RSRC_LEGACY_MEM)
    1299           0 :                                                 priv->cards[i].mem_cnt++;
    1300             :                                         break;
    1301             :                                 }
    1302             :                         }
    1303           0 :                         ret_val = count;
    1304           0 :                         goto done;
    1305             :                 } else {
    1306             :                         ret_val = -EBUSY;
    1307             :                         goto done;
    1308             :                 }
    1309             : 
    1310           0 :         } else if (strncmp(curr_pos, "target ", 7) == 0) {
    1311             :                 unsigned int domain, bus, devfn;
    1312             :                 struct vga_device *vgadev;
    1313             : 
    1314           0 :                 curr_pos += 7;
    1315           0 :                 remaining -= 7;
    1316             :                 pr_debug("client 0x%p called 'target'\n", priv);
    1317             :                 /* if target is default */
    1318           0 :                 if (!strncmp(curr_pos, "default", 7))
    1319           0 :                         pdev = pci_dev_get(vga_default_device());
    1320             :                 else {
    1321           0 :                         if (!vga_pci_str_to_vars(curr_pos, remaining,
    1322             :                                                  &domain, &bus, &devfn)) {
    1323             :                                 ret_val = -EPROTO;
    1324             :                                 goto done;
    1325             :                         }
    1326           0 :                         pdev = pci_get_domain_bus_and_slot(domain, bus, devfn);
    1327           0 :                         if (!pdev) {
    1328             :                                 pr_debug("invalid PCI address %04x:%02x:%02x.%x\n",
    1329             :                                          domain, bus, PCI_SLOT(devfn),
    1330             :                                          PCI_FUNC(devfn));
    1331             :                                 ret_val = -ENODEV;
    1332             :                                 goto done;
    1333             :                         }
    1334             : 
    1335             :                         pr_debug("%s ==> %04x:%02x:%02x.%x pdev %p\n", curr_pos,
    1336             :                                 domain, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
    1337             :                                 pdev);
    1338             :                 }
    1339             : 
    1340           0 :                 vgadev = vgadev_find(pdev);
    1341             :                 pr_debug("vgadev %p\n", vgadev);
    1342           0 :                 if (vgadev == NULL) {
    1343           0 :                         if (pdev) {
    1344             :                                 vgaarb_dbg(&pdev->dev, "not a VGA device\n");
    1345           0 :                                 pci_dev_put(pdev);
    1346             :                         }
    1347             : 
    1348             :                         ret_val = -ENODEV;
    1349             :                         goto done;
    1350             :                 }
    1351             : 
    1352           0 :                 priv->target = pdev;
    1353           0 :                 for (i = 0; i < MAX_USER_CARDS; i++) {
    1354           0 :                         if (priv->cards[i].pdev == pdev)
    1355             :                                 break;
    1356           0 :                         if (priv->cards[i].pdev == NULL) {
    1357           0 :                                 priv->cards[i].pdev = pdev;
    1358           0 :                                 priv->cards[i].io_cnt = 0;
    1359           0 :                                 priv->cards[i].mem_cnt = 0;
    1360           0 :                                 break;
    1361             :                         }
    1362             :                 }
    1363           0 :                 if (i == MAX_USER_CARDS) {
    1364             :                         vgaarb_dbg(&pdev->dev, "maximum user cards (%d) number reached, ignoring this one!\n",
    1365             :                                 MAX_USER_CARDS);
    1366           0 :                         pci_dev_put(pdev);
    1367             :                         /* XXX: which value to return? */
    1368           0 :                         ret_val =  -ENOMEM;
    1369           0 :                         goto done;
    1370             :                 }
    1371             : 
    1372           0 :                 ret_val = count;
    1373           0 :                 pci_dev_put(pdev);
    1374           0 :                 goto done;
    1375             : 
    1376             : 
    1377           0 :         } else if (strncmp(curr_pos, "decodes ", 8) == 0) {
    1378           0 :                 curr_pos += 8;
    1379           0 :                 remaining -= 8;
    1380             :                 pr_debug("client 0x%p called 'decodes'\n", priv);
    1381             : 
    1382           0 :                 if (!vga_str_to_iostate(curr_pos, remaining, &io_state)) {
    1383             :                         ret_val = -EPROTO;
    1384             :                         goto done;
    1385             :                 }
    1386           0 :                 pdev = priv->target;
    1387           0 :                 if (priv->target == NULL) {
    1388             :                         ret_val = -ENODEV;
    1389             :                         goto done;
    1390             :                 }
    1391             : 
    1392           0 :                 __vga_set_legacy_decoding(pdev, io_state, true);
    1393           0 :                 ret_val = count;
    1394           0 :                 goto done;
    1395             :         }
    1396             :         /* If we got here, the message written is not part of the protocol! */
    1397             :         return -EPROTO;
    1398             : 
    1399             : done:
    1400           0 :         return ret_val;
    1401             : }
    1402             : 
    1403           0 : static __poll_t vga_arb_fpoll(struct file *file, poll_table *wait)
    1404             : {
    1405           0 :         pr_debug("%s\n", __func__);
    1406             : 
    1407           0 :         poll_wait(file, &vga_wait_queue, wait);
    1408           0 :         return EPOLLIN;
    1409             : }
    1410             : 
    1411           0 : static int vga_arb_open(struct inode *inode, struct file *file)
    1412             : {
    1413             :         struct vga_arb_private *priv;
    1414             :         unsigned long flags;
    1415             : 
    1416             :         pr_debug("%s\n", __func__);
    1417             : 
    1418           0 :         priv = kzalloc(sizeof(*priv), GFP_KERNEL);
    1419           0 :         if (priv == NULL)
    1420             :                 return -ENOMEM;
    1421           0 :         spin_lock_init(&priv->lock);
    1422           0 :         file->private_data = priv;
    1423             : 
    1424           0 :         spin_lock_irqsave(&vga_user_lock, flags);
    1425           0 :         list_add(&priv->list, &vga_user_list);
    1426           0 :         spin_unlock_irqrestore(&vga_user_lock, flags);
    1427             : 
    1428             :         /* Set the client' lists of locks */
    1429           0 :         priv->target = vga_default_device(); /* Maybe this is still null! */
    1430           0 :         priv->cards[0].pdev = priv->target;
    1431           0 :         priv->cards[0].io_cnt = 0;
    1432           0 :         priv->cards[0].mem_cnt = 0;
    1433             : 
    1434             : 
    1435           0 :         return 0;
    1436             : }
    1437             : 
    1438           0 : static int vga_arb_release(struct inode *inode, struct file *file)
    1439             : {
    1440           0 :         struct vga_arb_private *priv = file->private_data;
    1441             :         struct vga_arb_user_card *uc;
    1442             :         unsigned long flags;
    1443             :         int i;
    1444             : 
    1445             :         pr_debug("%s\n", __func__);
    1446             : 
    1447           0 :         spin_lock_irqsave(&vga_user_lock, flags);
    1448           0 :         list_del(&priv->list);
    1449           0 :         for (i = 0; i < MAX_USER_CARDS; i++) {
    1450           0 :                 uc = &priv->cards[i];
    1451           0 :                 if (uc->pdev == NULL)
    1452           0 :                         continue;
    1453             :                 vgaarb_dbg(&uc->pdev->dev, "uc->io_cnt == %d, uc->mem_cnt == %d\n",
    1454             :                         uc->io_cnt, uc->mem_cnt);
    1455           0 :                 while (uc->io_cnt--)
    1456           0 :                         vga_put(uc->pdev, VGA_RSRC_LEGACY_IO);
    1457           0 :                 while (uc->mem_cnt--)
    1458           0 :                         vga_put(uc->pdev, VGA_RSRC_LEGACY_MEM);
    1459             :         }
    1460           0 :         spin_unlock_irqrestore(&vga_user_lock, flags);
    1461             : 
    1462           0 :         kfree(priv);
    1463             : 
    1464           0 :         return 0;
    1465             : }
    1466             : 
    1467             : /*
    1468             :  * callback any registered clients to let them know we have a
    1469             :  * change in VGA cards
    1470             :  */
    1471           0 : static void vga_arbiter_notify_clients(void)
    1472             : {
    1473             :         struct vga_device *vgadev;
    1474             :         unsigned long flags;
    1475             :         uint32_t new_decodes;
    1476             :         bool new_state;
    1477             : 
    1478           0 :         if (!vga_arbiter_used)
    1479             :                 return;
    1480             : 
    1481           0 :         spin_lock_irqsave(&vga_lock, flags);
    1482           0 :         list_for_each_entry(vgadev, &vga_list, list) {
    1483           0 :                 if (vga_count > 1)
    1484             :                         new_state = false;
    1485             :                 else
    1486           0 :                         new_state = true;
    1487           0 :                 if (vgadev->set_decode) {
    1488           0 :                         new_decodes = vgadev->set_decode(vgadev->pdev,
    1489             :                                                          new_state);
    1490           0 :                         vga_update_device_decodes(vgadev, new_decodes);
    1491             :                 }
    1492             :         }
    1493             :         spin_unlock_irqrestore(&vga_lock, flags);
    1494             : }
    1495             : 
    1496           0 : static int pci_notify(struct notifier_block *nb, unsigned long action,
    1497             :                       void *data)
    1498             : {
    1499           0 :         struct device *dev = data;
    1500           0 :         struct pci_dev *pdev = to_pci_dev(dev);
    1501           0 :         bool notify = false;
    1502             : 
    1503             :         vgaarb_dbg(dev, "%s\n", __func__);
    1504             : 
    1505             :         /* For now we're only intereted in devices added and removed. I didn't
    1506             :          * test this thing here, so someone needs to double check for the
    1507             :          * cases of hotplugable vga cards. */
    1508           0 :         if (action == BUS_NOTIFY_ADD_DEVICE)
    1509           0 :                 notify = vga_arbiter_add_pci_device(pdev);
    1510           0 :         else if (action == BUS_NOTIFY_DEL_DEVICE)
    1511           0 :                 notify = vga_arbiter_del_pci_device(pdev);
    1512             : 
    1513           0 :         if (notify)
    1514           0 :                 vga_arbiter_notify_clients();
    1515           0 :         return 0;
    1516             : }
    1517             : 
    1518             : static struct notifier_block pci_notifier = {
    1519             :         .notifier_call = pci_notify,
    1520             : };
    1521             : 
    1522             : static const struct file_operations vga_arb_device_fops = {
    1523             :         .read = vga_arb_read,
    1524             :         .write = vga_arb_write,
    1525             :         .poll = vga_arb_fpoll,
    1526             :         .open = vga_arb_open,
    1527             :         .release = vga_arb_release,
    1528             :         .llseek = noop_llseek,
    1529             : };
    1530             : 
    1531             : static struct miscdevice vga_arb_device = {
    1532             :         MISC_DYNAMIC_MINOR, "vga_arbiter", &vga_arb_device_fops
    1533             : };
    1534             : 
    1535           1 : static int __init vga_arb_device_init(void)
    1536             : {
    1537             :         int rc;
    1538             :         struct pci_dev *pdev;
    1539             : 
    1540           1 :         rc = misc_register(&vga_arb_device);
    1541           1 :         if (rc < 0)
    1542           0 :                 pr_err("error %d registering device\n", rc);
    1543             : 
    1544           1 :         bus_register_notifier(&pci_bus_type, &pci_notifier);
    1545             : 
    1546             :         /* We add all PCI devices satisfying VGA class in the arbiter by
    1547             :          * default */
    1548           1 :         pdev = NULL;
    1549           2 :         while ((pdev =
    1550             :                 pci_get_subsys(PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
    1551             :                                PCI_ANY_ID, pdev)) != NULL)
    1552           0 :                 vga_arbiter_add_pci_device(pdev);
    1553             : 
    1554           1 :         pr_info("loaded\n");
    1555           1 :         return rc;
    1556             : }
    1557             : subsys_initcall_sync(vga_arb_device_init);

Generated by: LCOV version 1.14