[PATCH 00/23] E500 Cleanup

Bernhard Beschow posted 23 patches 4 weeks, 1 day ago
There is a newer version of this series
MAINTAINERS              |   2 +-
hw/ppc/e500-ccsr.h       |   2 +
hw/ppc/e500.h            |   8 +++
hw/block/pflash_cfi01.c  |  21 +++----
hw/gpio/mpc8xxx.c        |  22 +++-----
hw/i2c/mpc_i2c.c         |  29 +++++-----
hw/i2c/smbus_eeprom.c    |  19 +++----
hw/net/fsl_etsec/etsec.c |  22 +++-----
hw/pci-host/ppce500.c    |  54 ++++++++----------
hw/ppc/e500.c            |  61 +++++---------------
hw/ppc/mpc8544_guts.c    |  32 +++++++----
hw/ppc/ppce500_ccsr.c    |  67 ++++++++++++++++++++++
hw/rtc/ds1338.c          |  20 +++----
hw/sd/sdhci.c            |  62 +++++++++-----------
hw/usb/hcd-ehci-sysbus.c | 118 +++++++++++++++++----------------------
hw/vfio/platform.c       |   7 +--
hw/i2c/trace-events      |   5 ++
hw/intc/Kconfig          |   4 ++
hw/intc/meson.build      |   3 +-
hw/ppc/meson.build       |   1 +
hw/ppc/trace-events      |   3 +
21 files changed, 285 insertions(+), 277 deletions(-)
create mode 100644 hw/ppc/ppce500_ccsr.c
[PATCH 00/23] E500 Cleanup
Posted by Bernhard Beschow 4 weeks, 1 day ago
This series is part of a bigger series exploring data-driven machine creation
using device tree blobs on top of the e500 machines [1]. It contains patches to
make this exploration easier which are also expected to provide value in
themselves.

The cleanup starts with the e500 machine class itself, then proceeds with
machine-specific device models and concludes with more or less loosely related
devices. Device cleanup mostly consists of using the DEFINE_TYPES() macro.

[1] https://github.com/shentok/qemu/tree/e500-fdt

Bernhard Beschow (23):
  hw/ppc/e500: Do not leak struct boot_info
  hw/ppc/e500: Reduce scope of env pointer
  hw/ppc/e500: Prefer QOM cast
  hw/ppc/e500: Remove unused "irqs" parameter
  hw/ppc/e500: Add missing device tree properties to i2c controller node
  hw/ppc/e500: Use SysBusDevice API to access TYPE_CCSR's internal
    resources
  hw/ppc/e500: Extract ppce500_ccsr.c
  hw/ppc/ppce500_ccsr: Log access to unimplemented registers
  hw/ppc/mpc8544_guts: Populate POR PLL ratio status register
  hw/i2c/mpc_i2c: Convert DPRINTF to trace events for register access
  hw/i2c/mpc_i2c: Prefer DEFINE_TYPES() macro
  hw/pci-host/ppce500: Reuse TYPE_PPC_E500_PCI_BRIDGE define
  hw/pci-host/ppce500: Prefer DEFINE_TYPES() macro
  hw/gpio/mpc8xxx: Prefer DEFINE_TYPES() macro
  hw/ppc/mpc8544_guts: Prefer DEFINE_TYPES() macro
  hw/net/fsl_etsec/etsec: Prefer DEFINE_TYPES() macro
  hw/intc: Guard openpic_kvm.c by dedicated OPENPIC_KVM Kconfig switch
  hw/sd/sdhci: Prefer DEFINE_TYPES() macro
  hw/block/pflash_cfi01: Prefer DEFINE_TYPES() macro
  hw/i2c/smbus_eeprom: Prefer DEFINE_TYPES() macro
  hw/rtc/ds1338: Prefer DEFINE_TYPES() macro
  hw/usb/hcd-ehci-sysbus: Prefer DEFINE_TYPES() macro
  hw/vfio/platform: Let vfio_start_eventfd_injection() take
    VFIOPlatformDevice pointer

 MAINTAINERS              |   2 +-
 hw/ppc/e500-ccsr.h       |   2 +
 hw/ppc/e500.h            |   8 +++
 hw/block/pflash_cfi01.c  |  21 +++----
 hw/gpio/mpc8xxx.c        |  22 +++-----
 hw/i2c/mpc_i2c.c         |  29 +++++-----
 hw/i2c/smbus_eeprom.c    |  19 +++----
 hw/net/fsl_etsec/etsec.c |  22 +++-----
 hw/pci-host/ppce500.c    |  54 ++++++++----------
 hw/ppc/e500.c            |  61 +++++---------------
 hw/ppc/mpc8544_guts.c    |  32 +++++++----
 hw/ppc/ppce500_ccsr.c    |  67 ++++++++++++++++++++++
 hw/rtc/ds1338.c          |  20 +++----
 hw/sd/sdhci.c            |  62 +++++++++-----------
 hw/usb/hcd-ehci-sysbus.c | 118 +++++++++++++++++----------------------
 hw/vfio/platform.c       |   7 +--
 hw/i2c/trace-events      |   5 ++
 hw/intc/Kconfig          |   4 ++
 hw/intc/meson.build      |   3 +-
 hw/ppc/meson.build       |   1 +
 hw/ppc/trace-events      |   3 +
 21 files changed, 285 insertions(+), 277 deletions(-)
 create mode 100644 hw/ppc/ppce500_ccsr.c

-- 
2.46.1

Re: [PATCH 00/23] E500 Cleanup
Posted by Cédric Le Goater 4 weeks, 1 day ago
Hello Bernhard,

On 9/23/24 11:29, Bernhard Beschow wrote:
> This series is part of a bigger series exploring data-driven machine creation
> using device tree blobs on top of the e500 machines [1]. It contains patches to
> make this exploration easier which are also expected to provide value in
> themselves.
> 
> The cleanup starts with the e500 machine class itself, then proceeds with
> machine-specific device models and concludes with more or less loosely related
> devices. Device cleanup mostly consists of using the DEFINE_TYPES() macro.

Since you recently took a look at the machine models, would you
be willing to take over maintenance of the e500 ? It shouldn't
be an enormous amount of work.

Thanks,

C.



> [1] https://github.com/shentok/qemu/tree/e500-fdt
> 
> Bernhard Beschow (23):
>    hw/ppc/e500: Do not leak struct boot_info
>    hw/ppc/e500: Reduce scope of env pointer
>    hw/ppc/e500: Prefer QOM cast
>    hw/ppc/e500: Remove unused "irqs" parameter
>    hw/ppc/e500: Add missing device tree properties to i2c controller node
>    hw/ppc/e500: Use SysBusDevice API to access TYPE_CCSR's internal
>      resources
>    hw/ppc/e500: Extract ppce500_ccsr.c
>    hw/ppc/ppce500_ccsr: Log access to unimplemented registers
>    hw/ppc/mpc8544_guts: Populate POR PLL ratio status register
>    hw/i2c/mpc_i2c: Convert DPRINTF to trace events for register access
>    hw/i2c/mpc_i2c: Prefer DEFINE_TYPES() macro
>    hw/pci-host/ppce500: Reuse TYPE_PPC_E500_PCI_BRIDGE define
>    hw/pci-host/ppce500: Prefer DEFINE_TYPES() macro
>    hw/gpio/mpc8xxx: Prefer DEFINE_TYPES() macro
>    hw/ppc/mpc8544_guts: Prefer DEFINE_TYPES() macro
>    hw/net/fsl_etsec/etsec: Prefer DEFINE_TYPES() macro
>    hw/intc: Guard openpic_kvm.c by dedicated OPENPIC_KVM Kconfig switch
>    hw/sd/sdhci: Prefer DEFINE_TYPES() macro
>    hw/block/pflash_cfi01: Prefer DEFINE_TYPES() macro
>    hw/i2c/smbus_eeprom: Prefer DEFINE_TYPES() macro
>    hw/rtc/ds1338: Prefer DEFINE_TYPES() macro
>    hw/usb/hcd-ehci-sysbus: Prefer DEFINE_TYPES() macro
>    hw/vfio/platform: Let vfio_start_eventfd_injection() take
>      VFIOPlatformDevice pointer
> 
>   MAINTAINERS              |   2 +-
>   hw/ppc/e500-ccsr.h       |   2 +
>   hw/ppc/e500.h            |   8 +++
>   hw/block/pflash_cfi01.c  |  21 +++----
>   hw/gpio/mpc8xxx.c        |  22 +++-----
>   hw/i2c/mpc_i2c.c         |  29 +++++-----
>   hw/i2c/smbus_eeprom.c    |  19 +++----
>   hw/net/fsl_etsec/etsec.c |  22 +++-----
>   hw/pci-host/ppce500.c    |  54 ++++++++----------
>   hw/ppc/e500.c            |  61 +++++---------------
>   hw/ppc/mpc8544_guts.c    |  32 +++++++----
>   hw/ppc/ppce500_ccsr.c    |  67 ++++++++++++++++++++++
>   hw/rtc/ds1338.c          |  20 +++----
>   hw/sd/sdhci.c            |  62 +++++++++-----------
>   hw/usb/hcd-ehci-sysbus.c | 118 +++++++++++++++++----------------------
>   hw/vfio/platform.c       |   7 +--
>   hw/i2c/trace-events      |   5 ++
>   hw/intc/Kconfig          |   4 ++
>   hw/intc/meson.build      |   3 +-
>   hw/ppc/meson.build       |   1 +
>   hw/ppc/trace-events      |   3 +
>   21 files changed, 285 insertions(+), 277 deletions(-)
>   create mode 100644 hw/ppc/ppce500_ccsr.c
>
Re: [PATCH 00/23] E500 Cleanup
Posted by Bernhard Beschow 4 weeks ago


Am 23. September 2024 20:23:54 UTC schrieb "Cédric Le Goater" <clg@redhat.com>:
>Hello Bernhard,

Hi Cédric,

>
>On 9/23/24 11:29, Bernhard Beschow wrote:
>> This series is part of a bigger series exploring data-driven machine creation
>> using device tree blobs on top of the e500 machines [1]. It contains patches to
>> make this exploration easier which are also expected to provide value in
>> themselves.
>> 
>> The cleanup starts with the e500 machine class itself, then proceeds with
>> machine-specific device models and concludes with more or less loosely related
>> devices. Device cleanup mostly consists of using the DEFINE_TYPES() macro.
>
>Since you recently took a look at the machine models, would you
>be willing to take over maintenance of the e500 ? It shouldn't
>be an enormous amount of work.

Are you referring to the machine and related devices or the CPU? I'm somewhat familiar with the P102x and could take over but the CPU would be a different beast.

Best regards,
Bernhard

>
>Thanks,
>
>C.
>
>
>
>> [1] https://github.com/shentok/qemu/tree/e500-fdt
>> 
>> Bernhard Beschow (23):
>>    hw/ppc/e500: Do not leak struct boot_info
>>    hw/ppc/e500: Reduce scope of env pointer
>>    hw/ppc/e500: Prefer QOM cast
>>    hw/ppc/e500: Remove unused "irqs" parameter
>>    hw/ppc/e500: Add missing device tree properties to i2c controller node
>>    hw/ppc/e500: Use SysBusDevice API to access TYPE_CCSR's internal
>>      resources
>>    hw/ppc/e500: Extract ppce500_ccsr.c
>>    hw/ppc/ppce500_ccsr: Log access to unimplemented registers
>>    hw/ppc/mpc8544_guts: Populate POR PLL ratio status register
>>    hw/i2c/mpc_i2c: Convert DPRINTF to trace events for register access
>>    hw/i2c/mpc_i2c: Prefer DEFINE_TYPES() macro
>>    hw/pci-host/ppce500: Reuse TYPE_PPC_E500_PCI_BRIDGE define
>>    hw/pci-host/ppce500: Prefer DEFINE_TYPES() macro
>>    hw/gpio/mpc8xxx: Prefer DEFINE_TYPES() macro
>>    hw/ppc/mpc8544_guts: Prefer DEFINE_TYPES() macro
>>    hw/net/fsl_etsec/etsec: Prefer DEFINE_TYPES() macro
>>    hw/intc: Guard openpic_kvm.c by dedicated OPENPIC_KVM Kconfig switch
>>    hw/sd/sdhci: Prefer DEFINE_TYPES() macro
>>    hw/block/pflash_cfi01: Prefer DEFINE_TYPES() macro
>>    hw/i2c/smbus_eeprom: Prefer DEFINE_TYPES() macro
>>    hw/rtc/ds1338: Prefer DEFINE_TYPES() macro
>>    hw/usb/hcd-ehci-sysbus: Prefer DEFINE_TYPES() macro
>>    hw/vfio/platform: Let vfio_start_eventfd_injection() take
>>      VFIOPlatformDevice pointer
>> 
>>   MAINTAINERS              |   2 +-
>>   hw/ppc/e500-ccsr.h       |   2 +
>>   hw/ppc/e500.h            |   8 +++
>>   hw/block/pflash_cfi01.c  |  21 +++----
>>   hw/gpio/mpc8xxx.c        |  22 +++-----
>>   hw/i2c/mpc_i2c.c         |  29 +++++-----
>>   hw/i2c/smbus_eeprom.c    |  19 +++----
>>   hw/net/fsl_etsec/etsec.c |  22 +++-----
>>   hw/pci-host/ppce500.c    |  54 ++++++++----------
>>   hw/ppc/e500.c            |  61 +++++---------------
>>   hw/ppc/mpc8544_guts.c    |  32 +++++++----
>>   hw/ppc/ppce500_ccsr.c    |  67 ++++++++++++++++++++++
>>   hw/rtc/ds1338.c          |  20 +++----
>>   hw/sd/sdhci.c            |  62 +++++++++-----------
>>   hw/usb/hcd-ehci-sysbus.c | 118 +++++++++++++++++----------------------
>>   hw/vfio/platform.c       |   7 +--
>>   hw/i2c/trace-events      |   5 ++
>>   hw/intc/Kconfig          |   4 ++
>>   hw/intc/meson.build      |   3 +-
>>   hw/ppc/meson.build       |   1 +
>>   hw/ppc/trace-events      |   3 +
>>   21 files changed, 285 insertions(+), 277 deletions(-)
>>   create mode 100644 hw/ppc/ppce500_ccsr.c
>> 
>
Re: [PATCH 00/23] E500 Cleanup
Posted by Cédric Le Goater 4 weeks ago
On 9/23/24 23:25, Bernhard Beschow wrote:
> 
> 
> 
> Am 23. September 2024 20:23:54 UTC schrieb "Cédric Le Goater" <clg@redhat.com>:
>> Hello Bernhard,
> 
> Hi Cédric,
> 
>>
>> On 9/23/24 11:29, Bernhard Beschow wrote:
>>> This series is part of a bigger series exploring data-driven machine creation
>>> using device tree blobs on top of the e500 machines [1]. It contains patches to
>>> make this exploration easier which are also expected to provide value in
>>> themselves.
>>>
>>> The cleanup starts with the e500 machine class itself, then proceeds with
>>> machine-specific device models and concludes with more or less loosely related
>>> devices. Device cleanup mostly consists of using the DEFINE_TYPES() macro.
>>
>> Since you recently took a look at the machine models, would you
>> be willing to take over maintenance of the e500 ? It shouldn't
>> be an enormous amount of work.
> 
> Are you referring to the machine and related devices or the CPU? I'm somewhat familiar with the P102x and could take over but the CPU would be a different beast.

Please take a look at the MAINTAINERS file. You will see it is not
that large and the CPU target models are not part of it.


Thanks,

C.

  


> 
> Best regards,
> Bernhard
> 
>>
>> Thanks,
>>
>> C.
>>
>>
>>
>>> [1] https://github.com/shentok/qemu/tree/e500-fdt
>>>
>>> Bernhard Beschow (23):
>>>     hw/ppc/e500: Do not leak struct boot_info
>>>     hw/ppc/e500: Reduce scope of env pointer
>>>     hw/ppc/e500: Prefer QOM cast
>>>     hw/ppc/e500: Remove unused "irqs" parameter
>>>     hw/ppc/e500: Add missing device tree properties to i2c controller node
>>>     hw/ppc/e500: Use SysBusDevice API to access TYPE_CCSR's internal
>>>       resources
>>>     hw/ppc/e500: Extract ppce500_ccsr.c
>>>     hw/ppc/ppce500_ccsr: Log access to unimplemented registers
>>>     hw/ppc/mpc8544_guts: Populate POR PLL ratio status register
>>>     hw/i2c/mpc_i2c: Convert DPRINTF to trace events for register access
>>>     hw/i2c/mpc_i2c: Prefer DEFINE_TYPES() macro
>>>     hw/pci-host/ppce500: Reuse TYPE_PPC_E500_PCI_BRIDGE define
>>>     hw/pci-host/ppce500: Prefer DEFINE_TYPES() macro
>>>     hw/gpio/mpc8xxx: Prefer DEFINE_TYPES() macro
>>>     hw/ppc/mpc8544_guts: Prefer DEFINE_TYPES() macro
>>>     hw/net/fsl_etsec/etsec: Prefer DEFINE_TYPES() macro
>>>     hw/intc: Guard openpic_kvm.c by dedicated OPENPIC_KVM Kconfig switch
>>>     hw/sd/sdhci: Prefer DEFINE_TYPES() macro
>>>     hw/block/pflash_cfi01: Prefer DEFINE_TYPES() macro
>>>     hw/i2c/smbus_eeprom: Prefer DEFINE_TYPES() macro
>>>     hw/rtc/ds1338: Prefer DEFINE_TYPES() macro
>>>     hw/usb/hcd-ehci-sysbus: Prefer DEFINE_TYPES() macro
>>>     hw/vfio/platform: Let vfio_start_eventfd_injection() take
>>>       VFIOPlatformDevice pointer
>>>
>>>    MAINTAINERS              |   2 +-
>>>    hw/ppc/e500-ccsr.h       |   2 +
>>>    hw/ppc/e500.h            |   8 +++
>>>    hw/block/pflash_cfi01.c  |  21 +++----
>>>    hw/gpio/mpc8xxx.c        |  22 +++-----
>>>    hw/i2c/mpc_i2c.c         |  29 +++++-----
>>>    hw/i2c/smbus_eeprom.c    |  19 +++----
>>>    hw/net/fsl_etsec/etsec.c |  22 +++-----
>>>    hw/pci-host/ppce500.c    |  54 ++++++++----------
>>>    hw/ppc/e500.c            |  61 +++++---------------
>>>    hw/ppc/mpc8544_guts.c    |  32 +++++++----
>>>    hw/ppc/ppce500_ccsr.c    |  67 ++++++++++++++++++++++
>>>    hw/rtc/ds1338.c          |  20 +++----
>>>    hw/sd/sdhci.c            |  62 +++++++++-----------
>>>    hw/usb/hcd-ehci-sysbus.c | 118 +++++++++++++++++----------------------
>>>    hw/vfio/platform.c       |   7 +--
>>>    hw/i2c/trace-events      |   5 ++
>>>    hw/intc/Kconfig          |   4 ++
>>>    hw/intc/meson.build      |   3 +-
>>>    hw/ppc/meson.build       |   1 +
>>>    hw/ppc/trace-events      |   3 +
>>>    21 files changed, 285 insertions(+), 277 deletions(-)
>>>    create mode 100644 hw/ppc/ppce500_ccsr.c
>>>
>>
> 


Re: [PATCH 00/23] E500 Cleanup
Posted by Bernhard Beschow 3 weeks, 5 days ago

Am 24. September 2024 08:33:26 UTC schrieb "Cédric Le Goater" <clg@redhat.com>:
>On 9/23/24 23:25, Bernhard Beschow wrote:
>> 
>> 
>> 
>> Am 23. September 2024 20:23:54 UTC schrieb "Cédric Le Goater" <clg@redhat.com>:
>>> Hello Bernhard,
>> 
>> Hi Cédric,
>> 
>>> 
>>> On 9/23/24 11:29, Bernhard Beschow wrote:
>>>> This series is part of a bigger series exploring data-driven machine creation
>>>> using device tree blobs on top of the e500 machines [1]. It contains patches to
>>>> make this exploration easier which are also expected to provide value in
>>>> themselves.
>>>> 
>>>> The cleanup starts with the e500 machine class itself, then proceeds with
>>>> machine-specific device models and concludes with more or less loosely related
>>>> devices. Device cleanup mostly consists of using the DEFINE_TYPES() macro.
>>> 
>>> Since you recently took a look at the machine models, would you
>>> be willing to take over maintenance of the e500 ? It shouldn't
>>> be an enormous amount of work.
>> 
>> Are you referring to the machine and related devices or the CPU? I'm somewhat familiar with the P102x and could take over but the CPU would be a different beast.
>
>Please take a look at the MAINTAINERS file. You will see it is not
>that large and the CPU target models are not part of it.

Patch sent: https://lore.kernel.org/qemu-devel/20240926075948.2343-1-shentey@gmail.com/

Best regards,
Bernhard

>
>
>Thanks,
>
>C.
>
> 
>
>> 
>> Best regards,
>> Bernhard
>> 
>>> 
>>> Thanks,
>>> 
>>> C.
>>> 
>>> 
>>> 
>>>> [1] https://github.com/shentok/qemu/tree/e500-fdt
>>>> 
>>>> Bernhard Beschow (23):
>>>>     hw/ppc/e500: Do not leak struct boot_info
>>>>     hw/ppc/e500: Reduce scope of env pointer
>>>>     hw/ppc/e500: Prefer QOM cast
>>>>     hw/ppc/e500: Remove unused "irqs" parameter
>>>>     hw/ppc/e500: Add missing device tree properties to i2c controller node
>>>>     hw/ppc/e500: Use SysBusDevice API to access TYPE_CCSR's internal
>>>>       resources
>>>>     hw/ppc/e500: Extract ppce500_ccsr.c
>>>>     hw/ppc/ppce500_ccsr: Log access to unimplemented registers
>>>>     hw/ppc/mpc8544_guts: Populate POR PLL ratio status register
>>>>     hw/i2c/mpc_i2c: Convert DPRINTF to trace events for register access
>>>>     hw/i2c/mpc_i2c: Prefer DEFINE_TYPES() macro
>>>>     hw/pci-host/ppce500: Reuse TYPE_PPC_E500_PCI_BRIDGE define
>>>>     hw/pci-host/ppce500: Prefer DEFINE_TYPES() macro
>>>>     hw/gpio/mpc8xxx: Prefer DEFINE_TYPES() macro
>>>>     hw/ppc/mpc8544_guts: Prefer DEFINE_TYPES() macro
>>>>     hw/net/fsl_etsec/etsec: Prefer DEFINE_TYPES() macro
>>>>     hw/intc: Guard openpic_kvm.c by dedicated OPENPIC_KVM Kconfig switch
>>>>     hw/sd/sdhci: Prefer DEFINE_TYPES() macro
>>>>     hw/block/pflash_cfi01: Prefer DEFINE_TYPES() macro
>>>>     hw/i2c/smbus_eeprom: Prefer DEFINE_TYPES() macro
>>>>     hw/rtc/ds1338: Prefer DEFINE_TYPES() macro
>>>>     hw/usb/hcd-ehci-sysbus: Prefer DEFINE_TYPES() macro
>>>>     hw/vfio/platform: Let vfio_start_eventfd_injection() take
>>>>       VFIOPlatformDevice pointer
>>>> 
>>>>    MAINTAINERS              |   2 +-
>>>>    hw/ppc/e500-ccsr.h       |   2 +
>>>>    hw/ppc/e500.h            |   8 +++
>>>>    hw/block/pflash_cfi01.c  |  21 +++----
>>>>    hw/gpio/mpc8xxx.c        |  22 +++-----
>>>>    hw/i2c/mpc_i2c.c         |  29 +++++-----
>>>>    hw/i2c/smbus_eeprom.c    |  19 +++----
>>>>    hw/net/fsl_etsec/etsec.c |  22 +++-----
>>>>    hw/pci-host/ppce500.c    |  54 ++++++++----------
>>>>    hw/ppc/e500.c            |  61 +++++---------------
>>>>    hw/ppc/mpc8544_guts.c    |  32 +++++++----
>>>>    hw/ppc/ppce500_ccsr.c    |  67 ++++++++++++++++++++++
>>>>    hw/rtc/ds1338.c          |  20 +++----
>>>>    hw/sd/sdhci.c            |  62 +++++++++-----------
>>>>    hw/usb/hcd-ehci-sysbus.c | 118 +++++++++++++++++----------------------
>>>>    hw/vfio/platform.c       |   7 +--
>>>>    hw/i2c/trace-events      |   5 ++
>>>>    hw/intc/Kconfig          |   4 ++
>>>>    hw/intc/meson.build      |   3 +-
>>>>    hw/ppc/meson.build       |   1 +
>>>>    hw/ppc/trace-events      |   3 +
>>>>    21 files changed, 285 insertions(+), 277 deletions(-)
>>>>    create mode 100644 hw/ppc/ppce500_ccsr.c
>>>> 
>>> 
>> 
>