Re: [PATCH 9/9] drm/verisilicon: Add starfive hdmi driver

2023-06-26 Thread Keith Zhao
yes I tested 
modetest -M starfive -D 0 -s 116@31:1280x720-59.94 -v
modetest -M starfive -D 0 -s 116@31:1920x1080 -v

and the second command will repeat the problem
as you advise at the beginning
I call the "starfive_hdmi_setup"  function in the "starfive_hdmi_encoder_enable"
instead of "starfive_hdmi_encoder_mode_set"
resolve the problem
i will add this modify in my next patch

Thank you Hoegeun

On 2023/6/23 10:38, Hoegeun Kwon wrote:
> Hi Keith,
> 
> There is a problem with stopping when changing modes.
> 
> Below test log
> 
> root:~> modetest -Mstarfive -c
> Connectors:
> id  encoder status  namesize (mm)   modes
> encoders
> 116 115 connected   HDMI-A-1320x180 51  115
>   modes:
> index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot
>   #0 1280x800 59.91 1280 1328 1360 1440 800 803 809 823 71000 flags: phsync,
> pvsync; type: preferred, driver
>   #1 1920x1080 60.00 1920 2008 2052 2200 1080 1084 1089 1125 148500 flags:
> phsync, pvsync; type: driver
> [...]
> 
> root:~> modetest -Mstarfive -s 116:#0 -v
> setting mode 1280x800-59.91Hz on connectors 116, crtc 31
> freq: 60.65Hz
> freq: 59.91Hz
> freq: 59.91Hz
> 
> root:~> modetest -Mstarfive -s 116:#1 -v
> setting mode 1920x1080-60.00Hz on connectors 116, crtc 31
> [   94.535626] rcu: INFO: rcu_sched detected stalls on CPUs/tasks:
> [   94.560985] rcu: 1-...0: (20 ticks this GP)
> idle=c9bc/1/0x4000 softirq=3869/3871 fqs=1120
> [   94.589532] rcu: (detected by 3, t=5264 jiffies, g=4645, q=63
> ncpus=4)
> [   94.615335] Task dump for CPU 1:
> [   94.637723] task:modeteststate:R  running task stack:0
> pid:407   ppid:397flags:0x0008
> [   94.667299] Call Trace:
> [   94.689297] [] __schedule+0x2a8/0xa52
> [   94.714221] [] schedule+0x5a/0xdc
> [   94.738626] [] schedule_timeout+0x220/0x2a6
> [   94.763762] [] wait_for_completion+0xfe/0x126
> [   94.789073] [] kthread_flush_worker+0x82/0xa0
> 
> 
>> -Original Message-
>> From: dri-devel  On Behalf Of
>> Keith Zhao
>> Sent: Friday, June 2, 2023 4:41 PM
>> To: dri-devel@lists.freedesktop.org; devicet...@vger.kernel.org; linux-
>> ker...@vger.kernel.org; linux-ri...@lists.infradead.org; linux-
>> me...@vger.kernel.org; linaro-mm-...@lists.linaro.org
>> Cc: Krzysztof Kozlowski ; Sumit Semwal
>> ; Emil Renner Berthing ;
>> Shengyang Chen ; Conor Dooley
>> ; Albert Ou ; Thomas
>> Zimmermann ; Jagan Teki ; Rob
>> Herring ; Chris Morgan ; Paul
>> Walmsley ; Keith Zhao
>> ; Bjorn Andersson ;
>> Changhuang Liang ; Jack Zhu
>> ; Palmer Dabbelt ; Shawn
>> Guo ; christian.koe...@amd.com
>> Subject: [PATCH 9/9] drm/verisilicon: Add starfive hdmi driver
>> 
>> Add HDMI dirver for StarFive SoC JH7110.
>> 
>> Signed-off-by: Keith Zhao 
>> ---
>>  drivers/gpu/drm/verisilicon/Kconfig |  11 +
>>  drivers/gpu/drm/verisilicon/Makefile|   1 +
>>  drivers/gpu/drm/verisilicon/starfive_hdmi.c | 928 
>> drivers/gpu/drm/verisilicon/starfive_hdmi.h | 296 +++
>>  drivers/gpu/drm/verisilicon/vs_drv.c|   6 +
>>  drivers/gpu/drm/verisilicon/vs_drv.h|   4 +
>>  6 files changed, 1246 insertions(+)
>>  create mode 100644 drivers/gpu/drm/verisilicon/starfive_hdmi.c
>>  create mode 100644 drivers/gpu/drm/verisilicon/starfive_hdmi.h
> 
> [...]
> 
>> diff --git a/drivers/gpu/drm/verisilicon/starfive_hdmi.c
>> b/drivers/gpu/drm/verisilicon/starfive_hdmi.c
>> new file mode 100644
>> index ..128ecca03309
>> --- /dev/null
>> +++ b/drivers/gpu/drm/verisilicon/starfive_hdmi.c
>> @@ -0,0 +1,928 @@
> 
> [...]
> 
>> +static int starfive_hdmi_setup(struct starfive_hdmi *hdmi,
>> +   struct drm_display_mode *mode) {
> 
> [...]
> 
>> +return 0;
>> +}
>> +
>> +static void starfive_hdmi_encoder_mode_set(struct drm_encoder *encoder,
>> +   struct drm_display_mode *mode,
>> +   struct drm_display_mode
> *adj_mode) {
>> +struct starfive_hdmi *hdmi = encoder_to_hdmi(encoder);
>> +
>> +starfive_hdmi_setup(hdmi, adj_mode);
> 
> When starfive_hdmi_setup runs here,
> when changing the mode, a problem occurs because try to write a value to reg
> in a state that is not resumed after suspend.
> 
>> +
>> +memcpy(>previous_mode, adj_mode, sizeof(hdmi-
>> >previous_mode)); }
>> +
>> +static void starfive_hdmi_encoder_enable(struct drm_encoder *encoder) {
>> +struct starfive_hdmi *hdmi = encoder_to_hdmi(encoder);
>> +
>> +pm_runtime_get_sync(hdmi->dev);
> 
> So if move the call point of starfive_hdmi_setup here, it works normally.
> 
>> +}
> 
> Best regards,
> Hoegeun
> 
> 


RE: [PATCH 9/9] drm/verisilicon: Add starfive hdmi driver

2023-06-22 Thread Hoegeun Kwon
Hi Keith,

There is a problem with stopping when changing modes.

Below test log

root:~> modetest -Mstarfive -c
Connectors:
id  encoder status  namesize (mm)   modes
encoders
116 115 connected   HDMI-A-1320x180 51  115
  modes:
index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot
  #0 1280x800 59.91 1280 1328 1360 1440 800 803 809 823 71000 flags: phsync,
pvsync; type: preferred, driver
  #1 1920x1080 60.00 1920 2008 2052 2200 1080 1084 1089 1125 148500 flags:
phsync, pvsync; type: driver
[...]

root:~> modetest -Mstarfive -s 116:#0 -v
setting mode 1280x800-59.91Hz on connectors 116, crtc 31
freq: 60.65Hz
freq: 59.91Hz
freq: 59.91Hz

root:~> modetest -Mstarfive -s 116:#1 -v
setting mode 1920x1080-60.00Hz on connectors 116, crtc 31
[   94.535626] rcu: INFO: rcu_sched detected stalls on CPUs/tasks:
[   94.560985] rcu: 1-...0: (20 ticks this GP)
idle=c9bc/1/0x4000 softirq=3869/3871 fqs=1120
[   94.589532] rcu: (detected by 3, t=5264 jiffies, g=4645, q=63
ncpus=4)
[   94.615335] Task dump for CPU 1:
[   94.637723] task:modeteststate:R  running task stack:0
pid:407   ppid:397flags:0x0008
[   94.667299] Call Trace:
[   94.689297] [] __schedule+0x2a8/0xa52
[   94.714221] [] schedule+0x5a/0xdc
[   94.738626] [] schedule_timeout+0x220/0x2a6
[   94.763762] [] wait_for_completion+0xfe/0x126
[   94.789073] [] kthread_flush_worker+0x82/0xa0


> -Original Message-
> From: dri-devel  On Behalf Of
> Keith Zhao
> Sent: Friday, June 2, 2023 4:41 PM
> To: dri-devel@lists.freedesktop.org; devicet...@vger.kernel.org; linux-
> ker...@vger.kernel.org; linux-ri...@lists.infradead.org; linux-
> me...@vger.kernel.org; linaro-mm-...@lists.linaro.org
> Cc: Krzysztof Kozlowski ; Sumit Semwal
> ; Emil Renner Berthing ;
> Shengyang Chen ; Conor Dooley
> ; Albert Ou ; Thomas
> Zimmermann ; Jagan Teki ; Rob
> Herring ; Chris Morgan ; Paul
> Walmsley ; Keith Zhao
> ; Bjorn Andersson ;
> Changhuang Liang ; Jack Zhu
> ; Palmer Dabbelt ; Shawn
> Guo ; christian.koe...@amd.com
> Subject: [PATCH 9/9] drm/verisilicon: Add starfive hdmi driver
> 
> Add HDMI dirver for StarFive SoC JH7110.
> 
> Signed-off-by: Keith Zhao 
> ---
>  drivers/gpu/drm/verisilicon/Kconfig |  11 +
>  drivers/gpu/drm/verisilicon/Makefile|   1 +
>  drivers/gpu/drm/verisilicon/starfive_hdmi.c | 928 
> drivers/gpu/drm/verisilicon/starfive_hdmi.h | 296 +++
>  drivers/gpu/drm/verisilicon/vs_drv.c|   6 +
>  drivers/gpu/drm/verisilicon/vs_drv.h|   4 +
>  6 files changed, 1246 insertions(+)
>  create mode 100644 drivers/gpu/drm/verisilicon/starfive_hdmi.c
>  create mode 100644 drivers/gpu/drm/verisilicon/starfive_hdmi.h

[...]

> diff --git a/drivers/gpu/drm/verisilicon/starfive_hdmi.c
> b/drivers/gpu/drm/verisilicon/starfive_hdmi.c
> new file mode 100644
> index ..128ecca03309
> --- /dev/null
> +++ b/drivers/gpu/drm/verisilicon/starfive_hdmi.c
> @@ -0,0 +1,928 @@

[...]

> +static int starfive_hdmi_setup(struct starfive_hdmi *hdmi,
> +struct drm_display_mode *mode) {

[...]

> + return 0;
> +}
> +
> +static void starfive_hdmi_encoder_mode_set(struct drm_encoder *encoder,
> +struct drm_display_mode *mode,
> +struct drm_display_mode
*adj_mode) {
> + struct starfive_hdmi *hdmi = encoder_to_hdmi(encoder);
> +
> + starfive_hdmi_setup(hdmi, adj_mode);

When starfive_hdmi_setup runs here,
when changing the mode, a problem occurs because try to write a value to reg
in a state that is not resumed after suspend.

> +
> + memcpy(>previous_mode, adj_mode, sizeof(hdmi-
> >previous_mode)); }
> +
> +static void starfive_hdmi_encoder_enable(struct drm_encoder *encoder) {
> + struct starfive_hdmi *hdmi = encoder_to_hdmi(encoder);
> +
> + pm_runtime_get_sync(hdmi->dev);

So if move the call point of starfive_hdmi_setup here, it works normally.

> +}

Best regards,
Hoegeun




Re: [PATCH 9/9] drm/verisilicon: Add starfive hdmi driver

2023-06-05 Thread Maxime Ripard
Hi,

On Fri, Jun 02, 2023 at 03:40:43PM +0800, Keith Zhao wrote:
> Add HDMI dirver for StarFive SoC JH7110.
> 
> Signed-off-by: Keith Zhao 

I have a few high level comments:

> +static int starfive_hdmi_setup(struct starfive_hdmi *hdmi,
> +struct drm_display_mode *mode)
> +{
> + hdmi_modb(hdmi, STARFIVE_BIAS_CONTROL, STARFIVE_BIAS_ENABLE, 
> STARFIVE_BIAS_ENABLE);
> + hdmi_writeb(hdmi, STARFIVE_RX_CONTROL, STARFIVE_RX_ENABLE);
> + hdmi->hdmi_data.vic = drm_match_cea_mode(mode);
> +
> + hdmi->tmds_rate = mode->clock * 1000;
> + starfive_hdmi_phy_clk_set_rate(hdmi);
> +
> + while (!(hdmi_readb(hdmi, STARFIVE_PRE_PLL_LOCK_STATUS) & 0x1))
> + continue;
> + while (!(hdmi_readb(hdmi, STARFIVE_POST_PLL_LOCK_STATUS) & 0x1))
> + continue;
> +
> + /*turn on LDO*/
> + hdmi_writeb(hdmi, STARFIVE_LDO_CONTROL, STARFIVE_LDO_ENABLE);
> + /*turn on serializer*/
> + hdmi_writeb(hdmi, STARFIVE_SERIALIER_CONTROL, 
> STARFIVE_SERIALIER_ENABLE);
> +
> + starfive_hdmi_tx_phy_power_down(hdmi);
> + starfive_hdmi_config_video_timing(hdmi, mode);
> + starfive_hdmi_tx_phy_power_on(hdmi);
> +
> + starfive_hdmi_tmds_driver_on(hdmi);
> + starfive_hdmi_sync_tmds(hdmi);
> +
> + return 0;
> +}

The PHY PLL supports rate until 594MHz, but I don't see any scrambler
setup here?

> +static void starfive_hdmi_encoder_mode_set(struct drm_encoder *encoder,
> +struct drm_display_mode *mode,
> +struct drm_display_mode *adj_mode)
> +{
> + struct starfive_hdmi *hdmi = encoder_to_hdmi(encoder);
> +
> + starfive_hdmi_setup(hdmi, adj_mode);

You should put that call into the enable callback, there's no need to
power it up at that point.

> + memcpy(>previous_mode, adj_mode, sizeof(hdmi->previous_mode));

You don't seem to be using that anywhere, and it's not the previous but
the current mode.

> +}
> +
> +static void starfive_hdmi_encoder_enable(struct drm_encoder *encoder)
> +{
> + struct starfive_hdmi *hdmi = encoder_to_hdmi(encoder);
> +
> + pm_runtime_get_sync(hdmi->dev);
> +}
> +
> +static void starfive_hdmi_encoder_disable(struct drm_encoder *encoder)
> +{
> + struct starfive_hdmi *hdmi = encoder_to_hdmi(encoder);
> +
> + pm_runtime_put(hdmi->dev);
> +}
> +
> +static bool starfive_hdmi_encoder_mode_fixup(struct drm_encoder *encoder,
> +  const struct drm_display_mode 
> *mode,
> +  struct drm_display_mode *adj_mode)
> +{
> + return true;
> +}

You can drop that one

> +static int
> +starfive_hdmi_encoder_atomic_check(struct drm_encoder *encoder,
> +struct drm_crtc_state *crtc_state,
> +struct drm_connector_state *conn_state)
> +{
> + return 0;
> +}

Ditto

> +static int starfive_hdmi_connector_get_modes(struct drm_connector *connector)
> +{
> + struct starfive_hdmi *hdmi = connector_to_hdmi(connector);
> + struct edid *edid;
> + int ret = 0;
> +
> + if (!hdmi->ddc)
> + return 0;
> +
> + edid = drm_get_edid(connector, hdmi->ddc);
> + if (edid) {
> + hdmi->hdmi_data.sink_is_hdmi = drm_detect_hdmi_monitor(edid);
> + hdmi->hdmi_data.sink_has_audio = drm_detect_monitor_audio(edid);
> + drm_connector_update_edid_property(connector, edid);
> + ret = drm_add_edid_modes(connector, edid);
> + kfree(edid);
> + }
> +
> + return ret;
> +}

get_modes can be called while the connector is inactive, you need to
call pm_runtime_get_sync / pm_runtime_put here

> +static enum drm_mode_status
> +starfive_hdmi_connector_mode_valid(struct drm_connector *connector,
> +struct drm_display_mode *mode)
> +{
> + const struct pre_pll_config *cfg = pre_pll_cfg_table;
> + int pclk = mode->clock * 1000;
> + bool valid = false;
> + int i;
> +
> + for (i = 0; cfg[i].pixclock != (~0UL); i++) {
> + if (pclk == cfg[i].pixclock) {
> + if (pclk > 29700)
> + continue;
> +
> + valid = true;
> + break;
> + }
> + }
> +
> + return (valid) ? MODE_OK : MODE_BAD;
> +}

So I guess that's why you don't bother with the scrambler, you filter
all the modes > 297MHz?

If so, you also need to make sure it happens in atomic_check. mode_valid
will only filter the modes exposed to userspace, but the userspace is
free to send any mode it wants and that's checked by atomic_check.

> +
> +static int
> +starfive_hdmi_probe_single_connector_modes(struct drm_connector *connector,
> +u32 maxX, u32 maxY)
> +{
> + struct starfive_hdmi *hdmi = connector_to_hdmi(connector);
> + int ret;
> +
> + 

Re: [PATCH 9/9] drm/verisilicon: Add starfive hdmi driver

2023-06-05 Thread Philipp Zabel
Hi Keith,

On Fri, Jun 02, 2023 at 03:40:43PM +0800, Keith Zhao wrote:
> Add HDMI dirver for StarFive SoC JH7110.
> 
> Signed-off-by: Keith Zhao 
> ---
>  drivers/gpu/drm/verisilicon/Kconfig |  11 +
>  drivers/gpu/drm/verisilicon/Makefile|   1 +
>  drivers/gpu/drm/verisilicon/starfive_hdmi.c | 928 
>  drivers/gpu/drm/verisilicon/starfive_hdmi.h | 296 +++
>  drivers/gpu/drm/verisilicon/vs_drv.c|   6 +
>  drivers/gpu/drm/verisilicon/vs_drv.h|   4 +
>  6 files changed, 1246 insertions(+)
>  create mode 100644 drivers/gpu/drm/verisilicon/starfive_hdmi.c
>  create mode 100644 drivers/gpu/drm/verisilicon/starfive_hdmi.h
> 
[...]
> diff --git a/drivers/gpu/drm/verisilicon/starfive_hdmi.c 
> b/drivers/gpu/drm/verisilicon/starfive_hdmi.c
> new file mode 100644
> index ..128ecca03309
> --- /dev/null
> +++ b/drivers/gpu/drm/verisilicon/starfive_hdmi.c
> @@ -0,0 +1,928 @@
[...]
> +static int starfive_hdmi_enable_clk_deassert_rst(struct device *dev, struct 
> starfive_hdmi *hdmi)
> +{
> + int ret;
> +
> + ret = clk_prepare_enable(hdmi->sys_clk);
> + if (ret) {
> + DRM_DEV_ERROR(dev, "Cannot enable HDMI sys clock: %d\n", ret);
> + return ret;
> + }
> +
> + ret = clk_prepare_enable(hdmi->mclk);
> + if (ret) {
> + DRM_DEV_ERROR(dev, "Cannot enable HDMI mclk clock: %d\n", ret);
> + return ret;
> + }
> + ret = clk_prepare_enable(hdmi->bclk);
> + if (ret) {
> + DRM_DEV_ERROR(dev, "Cannot enable HDMI bclk clock: %d\n", ret);
> + return ret;
> + }
> + ret = reset_control_deassert(hdmi->tx_rst);
> + if (ret < 0) {
> + dev_err(dev, "failed to deassert tx_rst\n");

The error paths should clk_disable_unprepare() enabled clocks.

> + return ret;
> + }
> + return 0;
> +}
> +
[...]
> +static int starfive_hdmi_get_clk_rst(struct device *dev, struct 
> starfive_hdmi *hdmi)
> +{
> + hdmi->sys_clk = devm_clk_get(dev, "sysclk");
> + if (IS_ERR(hdmi->sys_clk)) {
> + DRM_DEV_ERROR(dev, "Unable to get HDMI sysclk clk\n");
> + return PTR_ERR(hdmi->sys_clk);
> + }
> + hdmi->mclk = devm_clk_get(dev, "mclk");
> + if (IS_ERR(hdmi->mclk)) {
> + DRM_DEV_ERROR(dev, "Unable to get HDMI mclk clk\n");
> + return PTR_ERR(hdmi->mclk);
> + }
> + hdmi->bclk = devm_clk_get(dev, "bclk");
> + if (IS_ERR(hdmi->bclk)) {
> + DRM_DEV_ERROR(dev, "Unable to get HDMI bclk clk\n");
> + return PTR_ERR(hdmi->bclk);
> + }
> + hdmi->tx_rst = reset_control_get_shared(dev, "hdmi_tx");

Use devm_reset_control_get_shared() for consistency, otherwise this is missing
a reset_control_put() somewhere.

regards
Philipp


[PATCH 9/9] drm/verisilicon: Add starfive hdmi driver

2023-06-02 Thread Keith Zhao
Add HDMI dirver for StarFive SoC JH7110.

Signed-off-by: Keith Zhao 
---
 drivers/gpu/drm/verisilicon/Kconfig |  11 +
 drivers/gpu/drm/verisilicon/Makefile|   1 +
 drivers/gpu/drm/verisilicon/starfive_hdmi.c | 928 
 drivers/gpu/drm/verisilicon/starfive_hdmi.h | 296 +++
 drivers/gpu/drm/verisilicon/vs_drv.c|   6 +
 drivers/gpu/drm/verisilicon/vs_drv.h|   4 +
 6 files changed, 1246 insertions(+)
 create mode 100644 drivers/gpu/drm/verisilicon/starfive_hdmi.c
 create mode 100644 drivers/gpu/drm/verisilicon/starfive_hdmi.h

diff --git a/drivers/gpu/drm/verisilicon/Kconfig 
b/drivers/gpu/drm/verisilicon/Kconfig
index 89d12185f73b..35e85ac41b10 100644
--- a/drivers/gpu/drm/verisilicon/Kconfig
+++ b/drivers/gpu/drm/verisilicon/Kconfig
@@ -11,3 +11,14 @@ config DRM_VERISILICON
  This driver provides VeriSilicon kernel mode
  setting and buffer management. It does not
  provide 2D or 3D acceleration.
+
+config STARFIVE_HDMI
+   bool "Starfive specific extensions HDMI"
+   help
+  This selects support for StarFive SoC specific extensions
+  for the Innosilicon HDMI driver. If you want to enable
+  HDMI on JH7110 based SoC, you should select this option.
+
+  To compile this driver as a module, choose M here.
+
+
diff --git a/drivers/gpu/drm/verisilicon/Makefile 
b/drivers/gpu/drm/verisilicon/Makefile
index 0ed25b5e3062..ebe2c94f529a 100644
--- a/drivers/gpu/drm/verisilicon/Makefile
+++ b/drivers/gpu/drm/verisilicon/Makefile
@@ -8,5 +8,6 @@ vs_drm-objs := vs_dc_hw.o \
vs_gem.o \
vs_plane.o
 
+vs_drm-$(CONFIG_STARFIVE_HDMI) += starfive_hdmi.o
 obj-$(CONFIG_DRM_VERISILICON) += vs_drm.o
 
diff --git a/drivers/gpu/drm/verisilicon/starfive_hdmi.c 
b/drivers/gpu/drm/verisilicon/starfive_hdmi.c
new file mode 100644
index ..128ecca03309
--- /dev/null
+++ b/drivers/gpu/drm/verisilicon/starfive_hdmi.c
@@ -0,0 +1,928 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2023 StarFive Technology Co., Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "starfive_hdmi.h"
+#include "vs_drv.h"
+
+static struct starfive_hdmi *encoder_to_hdmi(struct drm_encoder *encoder)
+{
+   return container_of(encoder, struct starfive_hdmi, encoder);
+}
+
+static struct starfive_hdmi *connector_to_hdmi(struct drm_connector *connector)
+{
+   return container_of(connector, struct starfive_hdmi, connector);
+}
+
+struct starfive_hdmi_i2c {
+   struct i2c_adapter adap;
+
+   u8 ddc_addr;
+   u8 segment_addr;
+   /* protects the edid data when use i2c cmd to read edid */
+   struct mutex lock;
+   struct completion cmp;
+};
+
+static const struct pre_pll_config pre_pll_cfg_table[] = {
+   { 25175000,  25175000, 1,  100, 2, 3, 3, 12, 3, 3, 4, 0, 0xf5},
+   { 2520,  2520, 1,  100, 2, 3, 3, 12, 3, 3, 4, 0, 0},
+   { 2700,  2700, 1,  90, 3, 2, 2, 10, 3, 3, 4, 0, 0},
+   { 27027000,  27027000, 1,  90, 3, 2, 2, 10, 3, 3, 4, 0, 0x170a3d},
+   { 2832,  2832, 1,  28, 2, 1, 1,  3, 0, 3, 4, 0, 0x51eb85},
+   { 3024,  3024, 1,  30, 2, 1, 1,  3, 0, 3, 4, 0, 0x3d70a3},
+   { 3150,  3150, 1,  31, 2, 1, 1,  3, 0, 3, 4, 0, 0x7f},
+   { 3375,  3375, 1,  33, 2, 1, 1,  3, 0, 3, 4, 0, 0xcf},
+   { 3600,  3600, 1,  36, 2, 1, 1,  3, 0, 3, 4, 0, 0},
+   { 4000,  4000, 1,  80, 2, 2, 2, 12, 2, 2, 2, 0, 0},
+   { 4697,  4697, 1,  46, 2, 1, 1,  3, 0, 3, 4, 0, 0xf851eb},
+   { 4950,  4950, 1,  49, 2, 1, 1,  3, 0, 3, 4, 0, 0x7f},
+   { 4900,  4900, 1,  49, 2, 1, 1,  3, 0, 3, 4, 0, 0},
+   { 5000,  5000, 1,  50, 2, 1, 1,  3, 0, 3, 4, 0, 0},
+   { 5400,  5400, 1,  54, 2, 1, 1,  3, 0, 3, 4, 0, 0},
+   { 54054000,  54054000, 1,  54, 2, 1, 1,  3, 0, 3, 4, 0, 0x0dd2f1},
+   { 57284000,  57284000, 1,  57, 2, 1, 1,  3, 0, 3, 4, 0, 0x48b439},
+   { 5823,  5823, 1,  58, 2, 1, 1,  3, 0, 3, 4, 0, 0x3ae147},
+   { 59341000,  59341000, 1,  59, 2, 1, 1,  3, 0, 3, 4, 0, 0x574bc6},
+   { 5940,  5940, 1,  99, 3, 1, 1,  1, 3, 3, 4, 0, 0},
+   { 6500,  6500, 1, 130, 2, 2, 2,  12, 0, 2, 2, 0, 0},
+   { 6825,  6825, 1, 68,  2, 1, 1,  3,  0, 3, 4, 0, 0x3f},
+   { 7100,  7100, 1,  71, 2, 1, 1,  3, 0, 3,  4, 0, 0},
+   { 74176000,  74176000, 1,  98, 1, 2, 2,  1, 2, 3, 4, 0, 0xe6ae6b},
+   { 7425,  7425, 1,  99, 1, 2, 2,  1, 2, 3, 4, 0, 0},
+   { 7500,  7500, 1,  75, 2, 1, 1,  3, 0, 3, 4, 0, 0},
+   { 7875,  7875, 1,  78, 2, 1, 1,  3, 0, 3, 4, 0, 0xcf},
+   { 7950,  7950, 1,  79, 2, 1, 1,  3, 0, 3, 4, 0, 0x7f},