[Qemu-devel] [PATCH 4/5] PCI: do_pci_info(): PCI bridge support

2010-01-20 Thread Luiz Capitulino
This commit adds the pci_bridge key to the PCI device QDict,
it also adds support for printing it in the user protocol.

IMPORTANT: This code is being added separately because I could
NOT test it properly. According to Michael Tsirkin, it depends
on ultrasparc and it would take time to do the proper setup.

Signed-off-by: Luiz Capitulino lcapitul...@redhat.com
---
 hw/pci.c |   72 -
 1 files changed, 70 insertions(+), 2 deletions(-)

diff --git a/hw/pci.c b/hw/pci.c
index 3d0af69..ffe4cfe 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -1130,7 +1130,36 @@ static void pci_device_print(Monitor *mon, QDict *device)
 qdict_get_int(device, irq));
 }
 
-/* TODO: PCI bridge info */
+if (qdict_haskey(device, pci_bridge)) {
+QDict *info;
+
+qdict = qdict_get_qdict(device, pci_bridge);
+
+info = qdict_get_qdict(qdict, bus);
+monitor_printf(mon,   BUS % PRId64 .\n,
+qdict_get_int(info, number));
+monitor_printf(mon,   secondary bus % PRId64 .\n,
+qdict_get_int(info, secondary));
+monitor_printf(mon,   subordinate bus % PRId64 .\n,
+qdict_get_int(info, subordinate));
+
+info = qdict_get_qdict(qdict, io_range);
+monitor_printf(mon,   IO range [0x%04PRIx64, 0x%04PRIx64]\n,
+   qdict_get_int(info, base),
+   qdict_get_int(info, limit));
+
+info = qdict_get_qdict(qdict, memory_range);
+monitor_printf(mon,
+ memory range [0x%08PRIx64, 0x%08PRIx64]\n,
+   qdict_get_int(info, base),
+   qdict_get_int(info, limit));
+
+info = qdict_get_qdict(qdict, prefetchable_range);
+monitor_printf(mon,   prefetchable memory range 
+   [0x%08PRIx64, 0x%08PRIx64]\n,
+   qdict_get_int(info, base),
+qdict_get_int(info, limit));
+}
 
 QLIST_FOREACH_ENTRY(qdict_get_qlist(device, regions), entry) {
 qdict = qobject_to_qdict(qlist_entry_obj(entry));
@@ -1232,8 +1261,9 @@ static QObject *pci_get_regions_list(const PCIDevice *dev)
 return QOBJECT(regions_list);
 }
 
-static QObject *pci_get_dev_dict(const PCIDevice *dev, int bus_num)
+static QObject *pci_get_dev_dict(PCIDevice *dev, int bus_num)
 {
+int class;
 QObject *obj;
 
 obj = qobject_from_jsonf({ 'bus': %d, 'slot': %d, 'function': %d,
   'class_info': %p, 'id': %p, 'regions': %p,
@@ -1249,6 +1279,31 @@ static QObject *pci_get_dev_dict(const PCIDevice *dev, 
int bus_num)
 qdict_put(qdict, irq, 
qint_from_int(dev-config[PCI_INTERRUPT_LINE]));
 }
 
+class = pci_get_word(dev-config + PCI_CLASS_DEVICE);
+if (class == 0x0604) {
+QDict *qdict;
+QObject *pci_bridge;
+
+pci_bridge = qobject_from_jsonf({ 'bus': 
+{ 'number': %d, 'secondary': %d, 'subordinate': %d }, 
+'io_range': { 'base': % PRId64 , 'limit': % PRId64 }, 
+'memory_range': { 'base': % PRId64 , 'limit': % PRId64 }, 
+'prefetchable_range': { 'base': % PRId64 , 'limit': % PRId64 } },
+dev-config[0x19], dev-config[PCI_SECONDARY_BUS],
+dev-config[PCI_SUBORDINATE_BUS],
+pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_IO),
+pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_IO),
+pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_MEMORY),
+pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_MEMORY),
+pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_MEMORY |
+   PCI_BASE_ADDRESS_MEM_PREFETCH),
+pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_MEMORY |
+PCI_BASE_ADDRESS_MEM_PREFETCH));
+
+qdict = qobject_to_qdict(obj);
+qdict_put_obj(qdict, pci_bridge, pci_bridge);
+}
+
 return obj;
 }
 
@@ -1308,9 +1363,22 @@ static QObject *pci_get_bus_dict(PCIBus *bus, int 
bus_num)
  *  - vendor: vendor ID
  * - irq: device's IRQ if assigned (optional)
  * - qdev_id: qdev id string
+ * - pci_bridge: It's a QDict, only present if this device is a
+ *   PCI bridge, contains:
+ *  - bus: bus number
+ *  - secondary: secondary bus number
+ *  - subordinate: subordinate bus number
+ *  - io_range: a QDict with memory range information
+ *  - memory_range: a QDict with memory range information
+ *  - prefetchable_range: a QDict with memory range information
  * - regions: a QList of QDicts, each QDict represents a
  *   memory region of this device
  *
+ * The memory range QDict contains the following:
+ *
+ * - base: base memory address
+ * - limit: limit value
+ *
  * The region QDict can be an I/O region or a memory region,
  * an I/O region QDict contains the following:
  *
-- 
1.6.6





Re: [Qemu-devel] [PATCH 4/5] PCI: do_pci_info(): PCI bridge support

2010-01-19 Thread Luiz Capitulino
On Mon, 18 Jan 2010 18:14:32 +0100
Markus Armbruster arm...@redhat.com wrote:

 Luiz Capitulino lcapitul...@redhat.com writes:
 
  This commit adds the pci_bridge key to the PCI device QDict,
  it also adds support for printing it in the user protocol.
 
  IMPORTANT: This code is being added separately because I could
  NOT test it properly. According to Michael Tsirkin, it depends
  on ultrasparc and it would take time to do the proper setup.
 
  Signed-off-by: Luiz Capitulino lcapitul...@redhat.com
  ---
   hw/pci.c |   76 
  +++--
   1 files changed, 73 insertions(+), 3 deletions(-)
 
  diff --git a/hw/pci.c b/hw/pci.c
  index 8275ceb..d5e4866 100644
  --- a/hw/pci.c
  +++ b/hw/pci.c
  @@ -1102,6 +1102,7 @@ void pci_for_each_device(PCIBus *bus, int bus_num,
   
   static void pci_device_print(Monitor *mon, QDict *device)
   {
  +int class;
   QDict *qdict;
   QListEntry *entry;
   uint64_t addr, size;
  @@ -1113,10 +1114,11 @@ static void pci_device_print(Monitor *mon, QDict 
  *device)
   monitor_printf(mon, );
   
   qdict = qdict_get_qdict(device, class_info);
  +class = qdict_get_int(qdict, class);
   if (qdict_haskey(qdict, desc)) {
   monitor_printf(mon, %s, qdict_get_str(qdict, desc));
   } else {
  -monitor_printf(mon, Class %04 PRId64, qdict_get_int(qdict, 
  class));
  +monitor_printf(mon, Class %d, class);
   }
   
   qdict = qdict_get_qdict(device, id);
 
 This change seems unrelated.  Is it intentional?

 I guess it's not, I'll revert and re-submit.




Re: [Qemu-devel] [PATCH 4/5] PCI: do_pci_info(): PCI bridge support

2010-01-18 Thread Markus Armbruster
Luiz Capitulino lcapitul...@redhat.com writes:

 This commit adds the pci_bridge key to the PCI device QDict,
 it also adds support for printing it in the user protocol.

 IMPORTANT: This code is being added separately because I could
 NOT test it properly. According to Michael Tsirkin, it depends
 on ultrasparc and it would take time to do the proper setup.

 Signed-off-by: Luiz Capitulino lcapitul...@redhat.com
 ---
  hw/pci.c |   76 +++--
  1 files changed, 73 insertions(+), 3 deletions(-)

 diff --git a/hw/pci.c b/hw/pci.c
 index 8275ceb..d5e4866 100644
 --- a/hw/pci.c
 +++ b/hw/pci.c
 @@ -1102,6 +1102,7 @@ void pci_for_each_device(PCIBus *bus, int bus_num,
  
  static void pci_device_print(Monitor *mon, QDict *device)
  {
 +int class;
  QDict *qdict;
  QListEntry *entry;
  uint64_t addr, size;
 @@ -1113,10 +1114,11 @@ static void pci_device_print(Monitor *mon, QDict 
 *device)
  monitor_printf(mon, );
  
  qdict = qdict_get_qdict(device, class_info);
 +class = qdict_get_int(qdict, class);
  if (qdict_haskey(qdict, desc)) {
  monitor_printf(mon, %s, qdict_get_str(qdict, desc));
  } else {
 -monitor_printf(mon, Class %04 PRId64, qdict_get_int(qdict, 
 class));
 +monitor_printf(mon, Class %d, class);
  }
  
  qdict = qdict_get_qdict(device, id);

This change seems unrelated.  Is it intentional?

[...]




[Qemu-devel] [PATCH 4/5] PCI: do_pci_info(): PCI bridge support

2010-01-08 Thread Luiz Capitulino
This commit adds the pci_bridge key to the PCI device QDict,
it also adds support for printing it in the user protocol.

IMPORTANT: This code is being added separately because I could
NOT test it properly. According to Michael Tsirkin, it depends
on ultrasparc and it would take time to do the proper setup.

Signed-off-by: Luiz Capitulino lcapitul...@redhat.com
---
 hw/pci.c |   76 +++--
 1 files changed, 73 insertions(+), 3 deletions(-)

diff --git a/hw/pci.c b/hw/pci.c
index 8275ceb..d5e4866 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -1102,6 +1102,7 @@ void pci_for_each_device(PCIBus *bus, int bus_num,
 
 static void pci_device_print(Monitor *mon, QDict *device)
 {
+int class;
 QDict *qdict;
 QListEntry *entry;
 uint64_t addr, size;
@@ -1113,10 +1114,11 @@ static void pci_device_print(Monitor *mon, QDict 
*device)
 monitor_printf(mon, );
 
 qdict = qdict_get_qdict(device, class_info);
+class = qdict_get_int(qdict, class);
 if (qdict_haskey(qdict, desc)) {
 monitor_printf(mon, %s, qdict_get_str(qdict, desc));
 } else {
-monitor_printf(mon, Class %04 PRId64, qdict_get_int(qdict, class));
+monitor_printf(mon, Class %d, class);
 }
 
 qdict = qdict_get_qdict(device, id);
@@ -1129,7 +1131,36 @@ static void pci_device_print(Monitor *mon, QDict *device)
 qdict_get_int(device, irq));
 }
 
-/* TODO: PCI bridge info */
+if (qdict_haskey(device, pci_bridge)) {
+QDict *info;
+
+qdict = qdict_get_qdict(device, pci_bridge);
+
+info = qdict_get_qdict(qdict, bus);
+monitor_printf(mon,   BUS % PRId64 .\n,
+qdict_get_int(info, number));
+monitor_printf(mon,   secondary bus % PRId64 .\n,
+qdict_get_int(info, secondary));
+monitor_printf(mon,   subordinate bus % PRId64 .\n,
+qdict_get_int(info, subordinate));
+
+info = qdict_get_qdict(qdict, io_range);
+monitor_printf(mon,   IO range [0x%04PRIx64, 0x%04PRIx64]\n,
+   qdict_get_int(info, base),
+   qdict_get_int(info, limit));
+
+info = qdict_get_qdict(qdict, memory_range);
+monitor_printf(mon,
+ memory range [0x%08PRIx64, 0x%08PRIx64]\n,
+   qdict_get_int(info, base),
+   qdict_get_int(info, limit));
+
+info = qdict_get_qdict(qdict, prefetchable_range);
+monitor_printf(mon,   prefetchable memory range 
+   [0x%08PRIx64, 0x%08PRIx64]\n,
+   qdict_get_int(info, base),
+qdict_get_int(info, limit));
+}
 
 QLIST_FOREACH_ENTRY(qdict_get_qlist(device, regions), entry) {
 qdict = qobject_to_qdict(qlist_entry_obj(entry));
@@ -1227,8 +1258,9 @@ static QObject *pci_get_regions_list(const PCIDevice *dev)
 return QOBJECT(regions_list);
 }
 
-static QObject *pci_get_dev_dict(const PCIDevice *dev, int bus_num)
+static QObject *pci_get_dev_dict(PCIDevice *dev, int bus_num)
 {
+int class;
 QObject *obj;
 
 obj = qobject_from_jsonf({ 'bus': %d, 'slot': %d, 'function': %d,
   'class_info': %p, 'id': %p, 'regions': %p,
@@ -1244,6 +1276,31 @@ static QObject *pci_get_dev_dict(const PCIDevice *dev, 
int bus_num)
 qdict_put(qdict, irq, 
qint_from_int(dev-config[PCI_INTERRUPT_LINE]));
 }
 
+class = pci_get_word(dev-config + PCI_CLASS_DEVICE);
+if (class == 0x0604) {
+QDict *qdict;
+QObject *pci_bridge;
+
+pci_bridge = qobject_from_jsonf({ 'bus': 
+{ 'number': %d, 'secondary': %d, 'subordinate': %d }, 
+'io_range': { 'base': % PRId64 , 'limit': % PRId64 }, 
+'memory_range': { 'base': % PRId64 , 'limit': % PRId64 }, 
+'prefetchable_range': { 'base': % PRId64 , 'limit': % PRId64 } },
+dev-config[0x19], dev-config[PCI_SECONDARY_BUS],
+dev-config[PCI_SUBORDINATE_BUS],
+pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_IO),
+pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_IO),
+pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_MEMORY),
+pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_MEMORY),
+pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_MEMORY |
+   PCI_BASE_ADDRESS_MEM_PREFETCH),
+pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_MEMORY |
+PCI_BASE_ADDRESS_MEM_PREFETCH));
+
+qdict = qobject_to_qdict(obj);
+qdict_put_obj(qdict, pci_bridge, pci_bridge);
+}
+
 return obj;
 }
 
@@ -1303,9 +1360,22 @@ static QObject *pci_get_bus_dict(PCIBus *bus, int 
bus_num)
  *  - vendor: vendor ID
  * - irq: device's IRQ if assigned (optional)
  * - qdev_id: qdev id string
+ * - pci_bridge: It's a QDict, only present if 

[Qemu-devel] [PATCH 4/5] PCI: do_pci_info(): PCI bridge support

2010-01-05 Thread Luiz Capitulino
This commit adds the pci_bridge key to the PCI device QDict,
it also adds support for printing it in the user protocol.

This code is being added separately because I could not test it
properly. According to Michael Tsirkin, it depends on ultrasparc
and it would take time to do the proper setup.

Signed-off-by: Luiz Capitulino lcapitul...@redhat.com
---
 hw/pci.c |   76 +++--
 1 files changed, 73 insertions(+), 3 deletions(-)

diff --git a/hw/pci.c b/hw/pci.c
index 8ded418..4db392d 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -1077,6 +1077,7 @@ void pci_for_each_device(PCIBus *bus, int bus_num,
 
 static void pci_device_print(Monitor *mon, QDict *device)
 {
+int class;
 QDict *qdict;
 QListEntry *entry;
 uint64_t addr, size;
@@ -1088,10 +1089,11 @@ static void pci_device_print(Monitor *mon, QDict 
*device)
 monitor_printf(mon, );
 
 qdict = qdict_get_qdict(device, class_info);
+class = qdict_get_int(qdict, class);
 if (qdict_haskey(qdict, desc)) {
 monitor_printf(mon, %s, qdict_get_str(qdict, desc));
 } else {
-monitor_printf(mon, Class %04 PRId64, qdict_get_int(qdict, class));
+monitor_printf(mon, Class %d, class);
 }
 
 qdict = qdict_get_qdict(device, id);
@@ -1104,7 +1106,36 @@ static void pci_device_print(Monitor *mon, QDict *device)
 qdict_get_int(device, IRQ));
 }
 
-/* TODO: PCI bridge info */
+if (qdict_haskey(device, pci_bridge)) {
+QDict *info;
+
+qdict = qdict_get_qdict(device, pci_bridge);
+
+info = qdict_get_qdict(qdict, bus);
+monitor_printf(mon,   BUS % PRId64 .\n,
+qdict_get_int(info, number));
+monitor_printf(mon,   secondary bus % PRId64 .\n,
+qdict_get_int(info, secondary));
+monitor_printf(mon,   subordinate bus % PRId64 .\n,
+qdict_get_int(info, subordinate));
+
+info = qdict_get_qdict(qdict, io_range);
+monitor_printf(mon,   IO range [0x%04PRIx64, 0x%04PRIx64]\n,
+   qdict_get_int(info, base),
+   qdict_get_int(info, limit));
+
+info = qdict_get_qdict(qdict, memory_range);
+monitor_printf(mon,
+ memory range [0x%08PRIx64, 0x%08PRIx64]\n,
+   qdict_get_int(info, base),
+   qdict_get_int(info, limit));
+
+info = qdict_get_qdict(qdict, prefetchable_range);
+monitor_printf(mon,   prefetchable memory range 
+   [0x%08PRIx64, 0x%08PRIx64]\n,
+   qdict_get_int(info, base),
+qdict_get_int(info, limit));
+}
 
 QLIST_FOREACH_ENTRY(qdict_get_qlist(device, regions), entry) {
 qdict = qobject_to_qdict(qlist_entry_obj(entry));
@@ -1202,8 +1233,9 @@ static QObject *pci_get_regions_list(const PCIDevice *dev)
 return QOBJECT(regions_list);
 }
 
-static QObject *pci_get_dev_dict(const PCIDevice *dev, int bus_num)
+static QObject *pci_get_dev_dict(PCIDevice *dev, int bus_num)
 {
+int class;
 QObject *obj;
 
 obj = qobject_from_jsonf({ 'bus': %d, 'slot': %d, 'function': %d,
   'class_info': %p, 'id': %p, 'regions': %p,
@@ -1219,6 +1251,31 @@ static QObject *pci_get_dev_dict(const PCIDevice *dev, 
int bus_num)
 qdict_put(qdict, IRQ, 
qint_from_int(dev-config[PCI_INTERRUPT_LINE]));
 }
 
+class = pci_get_word(dev-config + PCI_CLASS_DEVICE);
+if (class == 0x0604) {
+QDict *qdict;
+QObject *pci_bridge;
+
+pci_bridge = qobject_from_jsonf({ 'bus': 
+{ 'number': %d, 'secondary': %d, 'subordinate': %d }, 
+'io_range': { 'base': % PRId64 , 'limit': % PRId64 }, 
+'memory_range': { 'base': % PRId64 , 'limit': % PRId64 }, 
+'prefetchable_range': { 'base': % PRId64 , 'limit': % PRId64 } },
+dev-config[0x19], dev-config[PCI_SECONDARY_BUS],
+dev-config[PCI_SUBORDINATE_BUS],
+pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_IO),
+pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_IO),
+pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_MEMORY),
+pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_MEMORY),
+pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_MEMORY |
+   PCI_BASE_ADDRESS_MEM_PREFETCH),
+pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_MEMORY |
+PCI_BASE_ADDRESS_MEM_PREFETCH));
+
+qdict = qobject_to_qdict(obj);
+qdict_put_obj(qdict, pci_bridge, pci_bridge);
+}
+
 return obj;
 }
 
@@ -1277,9 +1334,22 @@ static QObject *pci_get_bus_dict(PCIBus *bus, int 
bus_num)
  *  - device: device ID
  *  - vendor: vendor ID
  * - qdev_id: qdev id string
+ * - pci_bridge: It's a QDict, only present if this device is a
+ *   PCI