# -*- Mode: Python -*-
# vim: filetype=python
#
# This work is licensed under the terms of the GNU GPL, version 2 or later.
# See the COPYING file in the top-level directory.
# SPDX-License-Identifier: GPL-2.0-or-later

##
# = PCI
##

##
# @PciMemoryRange:
#
# A PCI device memory region
#
# @base: the starting address (guest physical)
#
# @limit: the ending address (guest physical)
#
# Since: 0.14
##
{ 'struct': 'PciMemoryRange', 'data': {'base': 'int', 'limit': 'int'} }

##
# @PciMemoryRegion:
#
# Information about a PCI device I/O region.
#
# @bar: the index of the Base Address Register for this region
#
# @type:
#     - 'io' if the region is a PIO region
#     - 'memory' if the region is a MMIO region
#
# @size: memory size
#
# @prefetch: if @type is 'memory', true if the memory is prefetchable
#
# @mem_type_64: if @type is 'memory', true if the BAR is 64-bit
#
# Since: 0.14
##
{ 'struct': 'PciMemoryRegion',
  'data': {'bar': 'int', 'type': 'str', 'address': 'int', 'size': 'int',
           '*prefetch': 'bool', '*mem_type_64': 'bool' } }

##
# @PciBusInfo:
#
# Information about a bus of a PCI Bridge device
#
# @number: primary bus interface number.  This should be the number of
#     the bus the device resides on.
#
# @secondary: secondary bus interface number.  This is the number of
#     the main bus for the bridge
#
# @subordinate: This is the highest number bus that resides below the
#     bridge.
#
# @io_range: The PIO range for all devices on this bridge
#
# @memory_range: The MMIO range for all devices on this bridge
#
# @prefetchable_range: The range of prefetchable MMIO for all devices
#     on this bridge
#
# Since: 2.4
##
{ 'struct': 'PciBusInfo',
  'data': {'number': 'int', 'secondary': 'int', 'subordinate': 'int',
           'io_range': 'PciMemoryRange',
           'memory_range': 'PciMemoryRange',
           'prefetchable_range': 'PciMemoryRange' } }

##
# @PciBridgeInfo:
#
# Information about a PCI Bridge device
#
# @bus: information about the bus the device resides on
#
# @devices: a list of @PciDeviceInfo for each device on this bridge
#
# Since: 0.14
##
{ 'struct': 'PciBridgeInfo',
  'data': {'bus': 'PciBusInfo', '*devices': ['PciDeviceInfo']} }

##
# @PciDeviceClass:
#
# Information about the Class of a PCI device
#
# @desc: a string description of the device's class
#
# @class: the class code of the device
#
# Since: 2.4
##
{ 'struct': 'PciDeviceClass',
  'data': {'*desc': 'str', 'class': 'int'} }

##
# @PciDeviceId:
#
# Information about the Id of a PCI device
#
# @device: the PCI device id
#
# @vendor: the PCI vendor id
#
# @subsystem: the PCI subsystem id (since 3.1)
#
# @subsystem-vendor: the PCI subsystem vendor id (since 3.1)
#
# Since: 2.4
##
{ 'struct': 'PciDeviceId',
  'data': {'device': 'int', 'vendor': 'int', '*subsystem': 'int',
            '*subsystem-vendor': 'int'} }

##
# @PciDeviceInfo:
#
# Information about a PCI device
#
# @bus: the bus number of the device
#
# @slot: the slot the device is located in
#
# @function: the function of the slot used by the device
#
# @class_info: the class of the device
#
# @id: the PCI device id
#
# @irq: if an IRQ is assigned to the device, the IRQ number
#
# @irq_pin: the IRQ pin, zero means no IRQ (since 5.1)
#
# @qdev_id: the device name of the PCI device
#
# @pci_bridge: if the device is a PCI bridge, the bridge information
#
# @regions: a list of the PCI I/O regions associated with the device
#
# Notes: the contents of @class_info.desc are not stable and should
#     only be treated as informational.
#
# Since: 0.14
##
{ 'struct': 'PciDeviceInfo',
  'data': {'bus': 'int', 'slot': 'int', 'function': 'int',
           'class_info': 'PciDeviceClass', 'id': 'PciDeviceId',
           '*irq': 'int', 'irq_pin': 'int', 'qdev_id': 'str',
           '*pci_bridge': 'PciBridgeInfo', 'regions': ['PciMemoryRegion'] }}

##
# @PciInfo:
#
# Information about a PCI bus
#
# @bus: the bus index
#
# @devices: a list of devices on this bus
#
# Since: 0.14
##
{ 'struct': 'PciInfo', 'data': {'bus': 'int', 'devices': ['PciDeviceInfo']} }

##
# @query-pci:
#
# Return information about the PCI bus topology of the guest.
#
# Returns: a list of @PciInfo for each PCI bus.  Each bus is
#     represented by a json-object, which has a key with a json-array
#     of all PCI devices attached to it.  Each device is represented
#     by a json-object.
#
# Since: 0.14
#
# Example:
#
#     -> { "execute": "query-pci" }
#     <- { "return": [
#              {
#                 "bus": 0,
#                 "devices": [
#                    {
#                       "bus": 0,
#                       "qdev_id": "",
#                       "slot": 0,
#                       "class_info": {
#                          "class": 1536,
#                          "desc": "Host bridge"
#                       },
#                       "id": {
#                          "device": 32902,
#                          "vendor": 4663
#                       },
#                       "function": 0,
#                       "regions": [
#                       ]
#                    },
#                    {
#                       "bus": 0,
#                       "qdev_id": "",
#                       "slot": 1,
#                       "class_info": {
#                          "class": 1537,
#                          "desc": "ISA bridge"
#                       },
#                       "id": {
#                          "device": 32902,
#                          "vendor": 28672
#                       },
#                       "function": 0,
#                       "regions": [
#                       ]
#                    },
#                    {
#                       "bus": 0,
#                       "qdev_id": "",
#                       "slot": 1,
#                       "class_info": {
#                          "class": 257,
#                          "desc": "IDE controller"
#                       },
#                       "id": {
#                          "device": 32902,
#                          "vendor": 28688
#                       },
#                       "function": 1,
#                       "regions": [
#                          {
#                             "bar": 4,
#                             "size": 16,
#                             "address": 49152,
#                             "type": "io"
#                          }
#                       ]
#                    },
#                    {
#                       "bus": 0,
#                       "qdev_id": "",
#                       "slot": 2,
#                       "class_info": {
#                          "class": 768,
#                          "desc": "VGA controller"
#                       },
#                       "id": {
#                          "device": 4115,
#                          "vendor": 184
#                       },
#                       "function": 0,
#                       "regions": [
#                          {
#                             "prefetch": true,
#                             "mem_type_64": false,
#                             "bar": 0,
#                             "size": 33554432,
#                             "address": 4026531840,
#                             "type": "memory"
#                          },
#                          {
#                             "prefetch": false,
#                             "mem_type_64": false,
#                             "bar": 1,
#                             "size": 4096,
#                             "address": 4060086272,
#                             "type": "memory"
#                          },
#                          {
#                             "prefetch": false,
#                             "mem_type_64": false,
#                             "bar": 6,
#                             "size": 65536,
#                             "address": -1,
#                             "type": "memory"
#                          }
#                       ]
#                    },
#                    {
#                       "bus": 0,
#                       "qdev_id": "",
#                       "irq": 11,
#                       "slot": 4,
#                       "class_info": {
#                          "class": 1280,
#                          "desc": "RAM controller"
#                       },
#                       "id": {
#                          "device": 6900,
#                          "vendor": 4098
#                       },
#                       "function": 0,
#                       "regions": [
#                          {
#                             "bar": 0,
#                             "size": 32,
#                             "address": 49280,
#                             "type": "io"
#                          }
#                       ]
#                    }
#                 ]
#              }
#           ]
#        }
#
# Note: This example has been shortened as the real response is too
#     long.
##
{ 'command': 'query-pci', 'returns': ['PciInfo'] }