1 | From: Baihan Li <libaihan@huawei.com> | 1 | From: Baihan Li <libaihan@huawei.com> |
---|---|---|---|
2 | 2 | ||
3 | To support DP HPD, edid printing, and colorbar display features based on | 3 | To support DP HPD, edid printing, and colorbar display features based on |
4 | the Hisislcon DP devices. | 4 | the Hisislcon DP devices. |
5 | --- | 5 | --- |
6 | ChangeLog: | 6 | ChangeLog: |
7 | v7 -> v8: | ||
8 | - use drm_edid_read() in hibmc_dp_connector_get_modes(), suggested by Jani Nikula | ||
9 | v7: https://lore.kernel.org/all/20250319032435.1119469-1-shiyongbang@huawei.com/ | ||
10 | v6 -> v7: | ||
11 | - add if statement about drm aux in hibmc_dp_connector_get_modes(), suggested by Jani Nikula | ||
12 | v6: https://lore.kernel.org/all/20250310040138.2025715-1-shiyongbang@huawei.com/ | ||
13 | v5 -> v6: | ||
14 | - fix the DP_SERDES_VOL2_PRE0 value after electrical test. | ||
15 | - move the detect_ctx() to the patch 7/9. | ||
16 | - add detect_ctx with 200ms delay, suggested by Dmitry Baryshkov. | ||
17 | v5: https://lore.kernel.org/all/20250307101640.4003229-1-shiyongbang@huawei.com/ | ||
18 | v4 -> v5: | ||
19 | - add commit log about hibmc_kms_init(), suggested by Dmitry Baryshkov. | ||
20 | - fix the format of block comments, suggested by Dmitry Baryshkov. | ||
21 | - add hibmc_dp_get_serdes_rate_cfg() to correct transferring serdes cfg. | ||
22 | - separate the vga part commit, suggested by Dmitry Baryshkov. | ||
23 | - remove pci_disable_msi() in hibmc_unload() | ||
24 | v4: https://lore.kernel.org/all/20250305112647.2344438-1-shiyongbang@huawei.com/ | ||
7 | v3 -> v4: | 25 | v3 -> v4: |
8 | - fix the serdes cfg in hibmc_dp_serdes_set_tx_cfg(), suggested by Dmitry Baryshkov. | 26 | - fix the serdes cfg in hibmc_dp_serdes_set_tx_cfg(), suggested by Dmitry Baryshkov. |
9 | - move the dp serdes registers to dp_reg.h, suggested by Dmitry Baryshkov. | 27 | - move the dp serdes registers to dp_reg.h, suggested by Dmitry Baryshkov. |
10 | - add comments for if-statement of dp_init(), suggested by Dmitry Baryshkov. | 28 | - add comments for if-statement of dp_init(), suggested by Dmitry Baryshkov. |
11 | - fix the comment log to imperative sentence, suggested by Dmitry Baryshkov. | 29 | - fix the comment log to imperative sentence, suggested by Dmitry Baryshkov. |
12 | - add comments in hibmc_control_write(), suggested by Dmitry Baryshkov. | 30 | - add comments in hibmc_control_write(), suggested by Dmitry Baryshkov. |
13 | - add link reset of rates and lanes in pre link training process, suggested by Dmitry Baryshkov. | 31 | - add link reset of rates and lanes in pre link training process, suggested by Dmitry Baryshkov. |
14 | - add vdac detect and connected/disconnected status to enable HPD process, suggested by Dmitry Baryshkov. | 32 | - add vdac detect and connected/disconnected status to enable HPD process, suggested by Dmitry Baryshkov. |
15 | - remove a drm_client, suggested by Dmitry Baryshkov. | 33 | - remove a drm_client, suggested by Dmitry Baryshkov. |
16 | - fix build errors reported by kernel test robot <lkp@intel.com> | 34 | - fix build errors reported by kernel test robot <lkp@intel.com> |
17 | Closes: https://lore.kernel.org/oe-kbuild-all/202502231304.BCzV4Y8D-lkp@intel.com/ | 35 | Closes: https://lore.kernel.org/oe-kbuild-all/202502231304.BCzV4Y8D-lkp@intel.com/ |
36 | v3: https://lore.kernel.org/all/20250222025102.1519798-1-shiyongbang@huawei.com/ | ||
18 | v2 -> v3: | 37 | v2 -> v3: |
19 | - restructuring the header p_reg.h, suggested by Dmitry Baryshkov. | 38 | - restructuring the header p_reg.h, suggested by Dmitry Baryshkov. |
20 | - add commit log about dp serdes, suggested by Dmitry Baryshkov. | 39 | - add commit log about dp serdes, suggested by Dmitry Baryshkov. |
21 | - return value in hibmc_dp_serdes_init(), suggested by Dmitry Baryshkov. | 40 | - return value in hibmc_dp_serdes_init(), suggested by Dmitry Baryshkov. |
22 | - add static const in the array of serdes_tx_cfg[], suggested by Dmitry Baryshkov. | 41 | - add static const in the array of serdes_tx_cfg[], suggested by Dmitry Baryshkov. |
... | ... | ||
34 | - change drm_kms_helper_connector_hotplug_event() to | 53 | - change drm_kms_helper_connector_hotplug_event() to |
35 | drm_connector_helper_hpd_irq_event(), suggested by Dmitry Baryshkov. | 54 | drm_connector_helper_hpd_irq_event(), suggested by Dmitry Baryshkov. |
36 | - move macros to dp_reg.h, suggested by Dmitry Baryshkov. | 55 | - move macros to dp_reg.h, suggested by Dmitry Baryshkov. |
37 | - remove struct irqs, suggested by Dmitry Baryshkov. | 56 | - remove struct irqs, suggested by Dmitry Baryshkov. |
38 | - split this patch into two parts, suggested by Dmitry Baryshkov. | 57 | - split this patch into two parts, suggested by Dmitry Baryshkov. |
58 | v2: https://lore.kernel.org/all/20250210144959.100551-1-shiyongbang@huawei.com/ | ||
39 | v1 -> v2: | 59 | v1 -> v2: |
40 | - splittting the patch and add more detailed the changes in the commit message, suggested by Dmitry Baryshkov. | 60 | - splittting the patch and add more detailed the changes in the commit message, suggested by Dmitry Baryshkov. |
41 | - changing all names of dp phy to dp serdes. | 61 | - changing all names of dp phy to dp serdes. |
42 | - deleting type conversion, suggested by Dmitry Baryshkov. | 62 | - deleting type conversion, suggested by Dmitry Baryshkov. |
43 | - deleting hibmc_dp_connector_get_modes() and using drm_connector_helper_get_modes(), suggested by Dmitry Baryshkov. | 63 | - deleting hibmc_dp_connector_get_modes() and using drm_connector_helper_get_modes(), suggested by Dmitry Baryshkov. |
... | ... | ||
46 | - using debugfs_init() callback, suggested by Dmitry Baryshkov. | 66 | - using debugfs_init() callback, suggested by Dmitry Baryshkov. |
47 | - splittting colorbar and debugfs in different patches, suggested by Dmitry Baryshkov. | 67 | - splittting colorbar and debugfs in different patches, suggested by Dmitry Baryshkov. |
48 | - optimizing the description in commit message, suggested by Dmitry Baryshkov. | 68 | - optimizing the description in commit message, suggested by Dmitry Baryshkov. |
49 | - add mdelay(100) comments, suggested by Dmitry Baryshkov. | 69 | - add mdelay(100) comments, suggested by Dmitry Baryshkov. |
50 | - deleting display enable in hpd event, suggested by Dmitry Baryshkov. | 70 | - deleting display enable in hpd event, suggested by Dmitry Baryshkov. |
71 | v1: https://lore.kernel.org/all/20250127032024.1542219-1-shiyongbang@huawei.com/ | ||
51 | --- | 72 | --- |
52 | 73 | ||
53 | Baihan Li (8): | 74 | Baihan Li (9): |
54 | drm/hisilicon/hibmc: Restructuring the header dp_reg.h | 75 | drm/hisilicon/hibmc: Restructuring the header dp_reg.h |
55 | drm/hisilicon/hibmc: Add dp serdes cfg to adjust serdes rate, voltage | 76 | drm/hisilicon/hibmc: Add dp serdes cfg to adjust serdes rate, voltage |
56 | and pre-emphasis | 77 | and pre-emphasis |
57 | drm/hisilicon/hibmc: Add dp serdes cfg in dp process | 78 | drm/hisilicon/hibmc: Add dp serdes cfg in dp process |
58 | drm/hisilicon/hibmc: Refactor the member of drm_aux in struct hibmc_dp | 79 | drm/hisilicon/hibmc: Refactor the member of drm_aux in struct hibmc_dp |
59 | drm/hisilicon/hibmc: Getting connector info and EDID by using AUX | 80 | drm/hisilicon/hibmc: Getting connector info and EDID by using AUX |
60 | channel | 81 | channel |
61 | drm/hisilicon/hibmc: Add colorbar-cfg feature and its debugfs file | 82 | drm/hisilicon/hibmc: Add colorbar-cfg feature and its debugfs file |
62 | drm/hisilicon/hibmc: Enable this hot plug detect of irq feature | 83 | drm/hisilicon/hibmc: Enable this hot plug detect of irq feature |
63 | drm/hisilicon/hibmc: Add MSI irq getting and requesting for HPD | 84 | drm/hisilicon/hibmc: Add MSI irq getting and requesting for HPD |
85 | drm/hisilicon/hibmc: Add vga connector detect functions | ||
64 | 86 | ||
65 | 1 | 0 | ||
66 | drivers/gpu/drm/hisilicon/hibmc/Makefile | 3 +- | 87 | drivers/gpu/drm/hisilicon/hibmc/Makefile | 3 +- |
67 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c | 16 ++- | 88 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c | 16 ++- |
68 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_comm.h | 10 +- | 89 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_comm.h | 10 +- |
69 | .../gpu/drm/hisilicon/hibmc/dp/dp_config.h | 2 + | 90 | .../gpu/drm/hisilicon/hibmc/dp/dp_config.h | 2 + |
70 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_hw.c | 91 +++++++++++- | 91 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_hw.c | 91 +++++++++++- |
71 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_hw.h | 36 +++++ | 92 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_hw.h | 36 +++++ |
72 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c | 57 +++++--- | 93 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c | 97 +++++++++---- |
73 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h | 130 +++++++++++++----- | 94 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h | 130 +++++++++++++----- |
74 | .../gpu/drm/hisilicon/hibmc/dp/dp_serdes.c | 71 ++++++++++ | 95 | .../gpu/drm/hisilicon/hibmc/dp/dp_serdes.c | 71 ++++++++++ |
75 | .../drm/hisilicon/hibmc/hibmc_drm_debugfs.c | 104 ++++++++++++++ | 96 | .../drm/hisilicon/hibmc/hibmc_drm_debugfs.c | 104 ++++++++++++++ |
76 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 67 ++++++++- | 97 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 74 +++++++++- |
77 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 88 +++++++++--- | 98 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 87 +++++++++--- |
78 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 12 ++ | 99 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 12 ++ |
79 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c | 3 + | 100 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c | 3 + |
80 | 15 files changed, 601 insertions(+), 89 deletions(-) | 101 | 14 files changed, 634 insertions(+), 102 deletions(-) |
81 | create mode 100644 1 | ||
82 | create mode 100644 drivers/gpu/drm/hisilicon/hibmc/dp/dp_serdes.c | 102 | create mode 100644 drivers/gpu/drm/hisilicon/hibmc/dp/dp_serdes.c |
83 | create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_debugfs.c | 103 | create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_debugfs.c |
84 | 104 | ||
85 | -- | 105 | -- |
86 | 2.33.0 | 106 | 2.33.0 | diff view generated by jsdifflib |
1 | From: Baihan Li <libaihan@huawei.com> | 1 | From: Baihan Li <libaihan@huawei.com> |
---|---|---|---|
2 | 2 | ||
3 | Move the macros below their corresponding registers to make | 3 | Move the macros below their corresponding registers to make |
4 | them more obvious. | 4 | them more obvious. |
5 | 5 | ||
6 | Signed-off-by: Baihan Li <libaihan@huawei.com> | 6 | Signed-off-by: Baihan Li <libaihan@huawei.com> |
7 | Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> | 7 | Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> |
8 | Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> | 8 | Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> |
9 | --- | 9 | --- |
10 | ChangeLog: | 10 | ChangeLog: |
11 | v2 -> v3: | 11 | v2 -> v3: |
12 | - restructuring the header dp_reg.h, suggested by Dmitry Baryshkov. | 12 | - restructuring the header dp_reg.h, suggested by Dmitry Baryshkov. |
13 | --- | 13 | --- |
14 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h | 98 +++++++++++++-------- | 14 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h | 98 +++++++++++++-------- |
15 | 1 file changed, 60 insertions(+), 38 deletions(-) | 15 | 1 file changed, 60 insertions(+), 38 deletions(-) |
16 | 16 | ||
17 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h | 17 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h |
18 | index XXXXXXX..XXXXXXX 100644 | 18 | index XXXXXXX..XXXXXXX 100644 |
19 | --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h | 19 | --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h |
20 | +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h | 20 | +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h |
21 | @@ -XXX,XX +XXX,XX @@ | 21 | @@ -XXX,XX +XXX,XX @@ |
22 | #define DP_REG_H | 22 | #define DP_REG_H |
23 | 23 | ||
24 | #define HIBMC_DP_AUX_CMD_ADDR 0x50 | 24 | #define HIBMC_DP_AUX_CMD_ADDR 0x50 |
25 | + | 25 | + |
26 | #define HIBMC_DP_AUX_WR_DATA0 0x54 | 26 | #define HIBMC_DP_AUX_WR_DATA0 0x54 |
27 | #define HIBMC_DP_AUX_WR_DATA1 0x58 | 27 | #define HIBMC_DP_AUX_WR_DATA1 0x58 |
28 | #define HIBMC_DP_AUX_WR_DATA2 0x5c | 28 | #define HIBMC_DP_AUX_WR_DATA2 0x5c |
29 | #define HIBMC_DP_AUX_WR_DATA3 0x60 | 29 | #define HIBMC_DP_AUX_WR_DATA3 0x60 |
30 | #define HIBMC_DP_AUX_RD_DATA0 0x64 | 30 | #define HIBMC_DP_AUX_RD_DATA0 0x64 |
31 | + | 31 | + |
32 | #define HIBMC_DP_AUX_REQ 0x74 | 32 | #define HIBMC_DP_AUX_REQ 0x74 |
33 | +#define HIBMC_DP_CFG_AUX_REQ BIT(0) | 33 | +#define HIBMC_DP_CFG_AUX_REQ BIT(0) |
34 | +#define HIBMC_DP_CFG_AUX_SYNC_LEN_SEL BIT(1) | 34 | +#define HIBMC_DP_CFG_AUX_SYNC_LEN_SEL BIT(1) |
35 | +#define HIBMC_DP_CFG_AUX_TIMER_TIMEOUT BIT(2) | 35 | +#define HIBMC_DP_CFG_AUX_TIMER_TIMEOUT BIT(2) |
36 | +#define HIBMC_DP_CFG_AUX_MIN_PULSE_NUM GENMASK(13, 9) | 36 | +#define HIBMC_DP_CFG_AUX_MIN_PULSE_NUM GENMASK(13, 9) |
37 | + | 37 | + |
38 | #define HIBMC_DP_AUX_STATUS 0x78 | 38 | #define HIBMC_DP_AUX_STATUS 0x78 |
39 | +#define HIBMC_DP_CFG_AUX_TIMEOUT BIT(0) | 39 | +#define HIBMC_DP_CFG_AUX_TIMEOUT BIT(0) |
40 | +#define HIBMC_DP_CFG_AUX_STATUS GENMASK(11, 4) | 40 | +#define HIBMC_DP_CFG_AUX_STATUS GENMASK(11, 4) |
41 | +#define HIBMC_DP_CFG_AUX_READY_DATA_BYTE GENMASK(16, 12) | 41 | +#define HIBMC_DP_CFG_AUX_READY_DATA_BYTE GENMASK(16, 12) |
42 | +#define HIBMC_DP_CFG_AUX GENMASK(24, 17) | 42 | +#define HIBMC_DP_CFG_AUX GENMASK(24, 17) |
43 | + | 43 | + |
44 | #define HIBMC_DP_PHYIF_CTRL0 0xa0 | 44 | #define HIBMC_DP_PHYIF_CTRL0 0xa0 |
45 | +#define HIBMC_DP_CFG_SCRAMBLE_EN BIT(0) | 45 | +#define HIBMC_DP_CFG_SCRAMBLE_EN BIT(0) |
46 | +#define HIBMC_DP_CFG_PAT_SEL GENMASK(7, 4) | 46 | +#define HIBMC_DP_CFG_PAT_SEL GENMASK(7, 4) |
47 | +#define HIBMC_DP_CFG_LANE_DATA_EN GENMASK(11, 8) | 47 | +#define HIBMC_DP_CFG_LANE_DATA_EN GENMASK(11, 8) |
48 | + | 48 | + |
49 | #define HIBMC_DP_VIDEO_CTRL 0x100 | 49 | #define HIBMC_DP_VIDEO_CTRL 0x100 |
50 | +#define HIBMC_DP_CFG_STREAM_RGB_ENABLE BIT(1) | 50 | +#define HIBMC_DP_CFG_STREAM_RGB_ENABLE BIT(1) |
51 | +#define HIBMC_DP_CFG_STREAM_VIDEO_MAPPING GENMASK(5, 2) | 51 | +#define HIBMC_DP_CFG_STREAM_VIDEO_MAPPING GENMASK(5, 2) |
52 | +#define HIBMC_DP_CFG_STREAM_FRAME_MODE BIT(6) | 52 | +#define HIBMC_DP_CFG_STREAM_FRAME_MODE BIT(6) |
53 | +#define HIBMC_DP_CFG_STREAM_HSYNC_POLARITY BIT(7) | 53 | +#define HIBMC_DP_CFG_STREAM_HSYNC_POLARITY BIT(7) |
54 | +#define HIBMC_DP_CFG_STREAM_VSYNC_POLARITY BIT(8) | 54 | +#define HIBMC_DP_CFG_STREAM_VSYNC_POLARITY BIT(8) |
55 | + | 55 | + |
56 | #define HIBMC_DP_VIDEO_CONFIG0 0x104 | 56 | #define HIBMC_DP_VIDEO_CONFIG0 0x104 |
57 | +#define HIBMC_DP_CFG_STREAM_HACTIVE GENMASK(31, 16) | 57 | +#define HIBMC_DP_CFG_STREAM_HACTIVE GENMASK(31, 16) |
58 | +#define HIBMC_DP_CFG_STREAM_HBLANK GENMASK(15, 0) | 58 | +#define HIBMC_DP_CFG_STREAM_HBLANK GENMASK(15, 0) |
59 | + | 59 | + |
60 | #define HIBMC_DP_VIDEO_CONFIG1 0x108 | 60 | #define HIBMC_DP_VIDEO_CONFIG1 0x108 |
61 | +#define HIBMC_DP_CFG_STREAM_VACTIVE GENMASK(31, 16) | 61 | +#define HIBMC_DP_CFG_STREAM_VACTIVE GENMASK(31, 16) |
62 | +#define HIBMC_DP_CFG_STREAM_VBLANK GENMASK(15, 0) | 62 | +#define HIBMC_DP_CFG_STREAM_VBLANK GENMASK(15, 0) |
63 | + | 63 | + |
64 | #define HIBMC_DP_VIDEO_CONFIG2 0x10c | 64 | #define HIBMC_DP_VIDEO_CONFIG2 0x10c |
65 | +#define HIBMC_DP_CFG_STREAM_HSYNC_WIDTH GENMASK(15, 0) | 65 | +#define HIBMC_DP_CFG_STREAM_HSYNC_WIDTH GENMASK(15, 0) |
66 | + | 66 | + |
67 | #define HIBMC_DP_VIDEO_CONFIG3 0x110 | 67 | #define HIBMC_DP_VIDEO_CONFIG3 0x110 |
68 | +#define HIBMC_DP_CFG_STREAM_VSYNC_WIDTH GENMASK(15, 0) | 68 | +#define HIBMC_DP_CFG_STREAM_VSYNC_WIDTH GENMASK(15, 0) |
69 | +#define HIBMC_DP_CFG_STREAM_VFRONT_PORCH GENMASK(31, 16) | 69 | +#define HIBMC_DP_CFG_STREAM_VFRONT_PORCH GENMASK(31, 16) |
70 | + | 70 | + |
71 | #define HIBMC_DP_VIDEO_PACKET 0x114 | 71 | #define HIBMC_DP_VIDEO_PACKET 0x114 |
72 | +#define HIBMC_DP_CFG_STREAM_TU_SYMBOL_SIZE GENMASK(5, 0) | 72 | +#define HIBMC_DP_CFG_STREAM_TU_SYMBOL_SIZE GENMASK(5, 0) |
73 | +#define HIBMC_DP_CFG_STREAM_TU_SYMBOL_FRAC_SIZE GENMASK(9, 6) | 73 | +#define HIBMC_DP_CFG_STREAM_TU_SYMBOL_FRAC_SIZE GENMASK(9, 6) |
74 | + | 74 | + |
75 | #define HIBMC_DP_VIDEO_MSA0 0x118 | 75 | #define HIBMC_DP_VIDEO_MSA0 0x118 |
76 | +#define HIBMC_DP_CFG_STREAM_VSTART GENMASK(31, 16) | 76 | +#define HIBMC_DP_CFG_STREAM_VSTART GENMASK(31, 16) |
77 | +#define HIBMC_DP_CFG_STREAM_HSTART GENMASK(15, 0) | 77 | +#define HIBMC_DP_CFG_STREAM_HSTART GENMASK(15, 0) |
78 | + | 78 | + |
79 | #define HIBMC_DP_VIDEO_MSA1 0x11c | 79 | #define HIBMC_DP_VIDEO_MSA1 0x11c |
80 | #define HIBMC_DP_VIDEO_MSA2 0x120 | 80 | #define HIBMC_DP_VIDEO_MSA2 0x120 |
81 | + | 81 | + |
82 | #define HIBMC_DP_VIDEO_HORIZONTAL_SIZE 0X124 | 82 | #define HIBMC_DP_VIDEO_HORIZONTAL_SIZE 0X124 |
83 | +#define HIBMC_DP_CFG_STREAM_HTOTAL_SIZE GENMASK(31, 16) | 83 | +#define HIBMC_DP_CFG_STREAM_HTOTAL_SIZE GENMASK(31, 16) |
84 | +#define HIBMC_DP_CFG_STREAM_HBLANK_SIZE GENMASK(15, 0) | 84 | +#define HIBMC_DP_CFG_STREAM_HBLANK_SIZE GENMASK(15, 0) |
85 | + | 85 | + |
86 | #define HIBMC_DP_TIMING_GEN_CONFIG0 0x26c | 86 | #define HIBMC_DP_TIMING_GEN_CONFIG0 0x26c |
87 | +#define HIBMC_DP_CFG_TIMING_GEN0_HACTIVE GENMASK(31, 16) | 87 | +#define HIBMC_DP_CFG_TIMING_GEN0_HACTIVE GENMASK(31, 16) |
88 | +#define HIBMC_DP_CFG_TIMING_GEN0_HBLANK GENMASK(15, 0) | 88 | +#define HIBMC_DP_CFG_TIMING_GEN0_HBLANK GENMASK(15, 0) |
89 | + | 89 | + |
90 | #define HIBMC_DP_TIMING_GEN_CONFIG2 0x274 | 90 | #define HIBMC_DP_TIMING_GEN_CONFIG2 0x274 |
91 | +#define HIBMC_DP_CFG_TIMING_GEN0_VACTIVE GENMASK(31, 16) | 91 | +#define HIBMC_DP_CFG_TIMING_GEN0_VACTIVE GENMASK(31, 16) |
92 | +#define HIBMC_DP_CFG_TIMING_GEN0_VBLANK GENMASK(15, 0) | 92 | +#define HIBMC_DP_CFG_TIMING_GEN0_VBLANK GENMASK(15, 0) |
93 | + | 93 | + |
94 | #define HIBMC_DP_TIMING_GEN_CONFIG3 0x278 | 94 | #define HIBMC_DP_TIMING_GEN_CONFIG3 0x278 |
95 | +#define HIBMC_DP_CFG_TIMING_GEN0_VFRONT_PORCH GENMASK(31, 16) | 95 | +#define HIBMC_DP_CFG_TIMING_GEN0_VFRONT_PORCH GENMASK(31, 16) |
96 | + | 96 | + |
97 | #define HIBMC_DP_HDCP_CFG 0x600 | 97 | #define HIBMC_DP_HDCP_CFG 0x600 |
98 | + | 98 | + |
99 | #define HIBMC_DP_DPTX_RST_CTRL 0x700 | 99 | #define HIBMC_DP_DPTX_RST_CTRL 0x700 |
100 | +#define HIBMC_DP_CFG_AUX_RST_N BIT(4) | 100 | +#define HIBMC_DP_CFG_AUX_RST_N BIT(4) |
101 | + | 101 | + |
102 | #define HIBMC_DP_DPTX_CLK_CTRL 0x704 | 102 | #define HIBMC_DP_DPTX_CLK_CTRL 0x704 |
103 | + | 103 | + |
104 | #define HIBMC_DP_DPTX_GCTL0 0x708 | 104 | #define HIBMC_DP_DPTX_GCTL0 0x708 |
105 | +#define HIBMC_DP_CFG_PHY_LANE_NUM GENMASK(2, 1) | 105 | +#define HIBMC_DP_CFG_PHY_LANE_NUM GENMASK(2, 1) |
106 | + | 106 | + |
107 | #define HIBMC_DP_INTR_ENABLE 0x720 | 107 | #define HIBMC_DP_INTR_ENABLE 0x720 |
108 | #define HIBMC_DP_INTR_ORIGINAL_STATUS 0x728 | 108 | #define HIBMC_DP_INTR_ORIGINAL_STATUS 0x728 |
109 | -#define HIBMC_DP_TIMING_MODEL_CTRL 0x884 | 109 | -#define HIBMC_DP_TIMING_MODEL_CTRL 0x884 |
110 | -#define HIBMC_DP_TIMING_SYNC_CTRL 0xFF0 | 110 | -#define HIBMC_DP_TIMING_SYNC_CTRL 0xFF0 |
111 | 111 | ||
112 | -#define HIBMC_DP_CFG_AUX_SYNC_LEN_SEL BIT(1) | 112 | -#define HIBMC_DP_CFG_AUX_SYNC_LEN_SEL BIT(1) |
113 | -#define HIBMC_DP_CFG_AUX_TIMER_TIMEOUT BIT(2) | 113 | -#define HIBMC_DP_CFG_AUX_TIMER_TIMEOUT BIT(2) |
114 | -#define HIBMC_DP_CFG_STREAM_FRAME_MODE BIT(6) | 114 | -#define HIBMC_DP_CFG_STREAM_FRAME_MODE BIT(6) |
115 | -#define HIBMC_DP_CFG_AUX_MIN_PULSE_NUM GENMASK(13, 9) | 115 | -#define HIBMC_DP_CFG_AUX_MIN_PULSE_NUM GENMASK(13, 9) |
116 | -#define HIBMC_DP_CFG_LANE_DATA_EN GENMASK(11, 8) | 116 | -#define HIBMC_DP_CFG_LANE_DATA_EN GENMASK(11, 8) |
117 | -#define HIBMC_DP_CFG_PHY_LANE_NUM GENMASK(2, 1) | 117 | -#define HIBMC_DP_CFG_PHY_LANE_NUM GENMASK(2, 1) |
118 | -#define HIBMC_DP_CFG_AUX_REQ BIT(0) | 118 | -#define HIBMC_DP_CFG_AUX_REQ BIT(0) |
119 | -#define HIBMC_DP_CFG_AUX_RST_N BIT(4) | 119 | -#define HIBMC_DP_CFG_AUX_RST_N BIT(4) |
120 | -#define HIBMC_DP_CFG_AUX_TIMEOUT BIT(0) | 120 | -#define HIBMC_DP_CFG_AUX_TIMEOUT BIT(0) |
121 | -#define HIBMC_DP_CFG_AUX_READY_DATA_BYTE GENMASK(16, 12) | 121 | -#define HIBMC_DP_CFG_AUX_READY_DATA_BYTE GENMASK(16, 12) |
122 | -#define HIBMC_DP_CFG_AUX GENMASK(24, 17) | 122 | -#define HIBMC_DP_CFG_AUX GENMASK(24, 17) |
123 | -#define HIBMC_DP_CFG_AUX_STATUS GENMASK(11, 4) | 123 | -#define HIBMC_DP_CFG_AUX_STATUS GENMASK(11, 4) |
124 | -#define HIBMC_DP_CFG_SCRAMBLE_EN BIT(0) | 124 | -#define HIBMC_DP_CFG_SCRAMBLE_EN BIT(0) |
125 | -#define HIBMC_DP_CFG_PAT_SEL GENMASK(7, 4) | 125 | -#define HIBMC_DP_CFG_PAT_SEL GENMASK(7, 4) |
126 | -#define HIBMC_DP_CFG_TIMING_GEN0_HACTIVE GENMASK(31, 16) | 126 | -#define HIBMC_DP_CFG_TIMING_GEN0_HACTIVE GENMASK(31, 16) |
127 | -#define HIBMC_DP_CFG_TIMING_GEN0_HBLANK GENMASK(15, 0) | 127 | -#define HIBMC_DP_CFG_TIMING_GEN0_HBLANK GENMASK(15, 0) |
128 | -#define HIBMC_DP_CFG_TIMING_GEN0_VACTIVE GENMASK(31, 16) | 128 | -#define HIBMC_DP_CFG_TIMING_GEN0_VACTIVE GENMASK(31, 16) |
129 | -#define HIBMC_DP_CFG_TIMING_GEN0_VBLANK GENMASK(15, 0) | 129 | -#define HIBMC_DP_CFG_TIMING_GEN0_VBLANK GENMASK(15, 0) |
130 | -#define HIBMC_DP_CFG_TIMING_GEN0_VFRONT_PORCH GENMASK(31, 16) | 130 | -#define HIBMC_DP_CFG_TIMING_GEN0_VFRONT_PORCH GENMASK(31, 16) |
131 | -#define HIBMC_DP_CFG_STREAM_HACTIVE GENMASK(31, 16) | 131 | -#define HIBMC_DP_CFG_STREAM_HACTIVE GENMASK(31, 16) |
132 | -#define HIBMC_DP_CFG_STREAM_HBLANK GENMASK(15, 0) | 132 | -#define HIBMC_DP_CFG_STREAM_HBLANK GENMASK(15, 0) |
133 | -#define HIBMC_DP_CFG_STREAM_HSYNC_WIDTH GENMASK(15, 0) | 133 | -#define HIBMC_DP_CFG_STREAM_HSYNC_WIDTH GENMASK(15, 0) |
134 | -#define HIBMC_DP_CFG_STREAM_VACTIVE GENMASK(31, 16) | 134 | -#define HIBMC_DP_CFG_STREAM_VACTIVE GENMASK(31, 16) |
135 | -#define HIBMC_DP_CFG_STREAM_VBLANK GENMASK(15, 0) | 135 | -#define HIBMC_DP_CFG_STREAM_VBLANK GENMASK(15, 0) |
136 | -#define HIBMC_DP_CFG_STREAM_VFRONT_PORCH GENMASK(31, 16) | 136 | -#define HIBMC_DP_CFG_STREAM_VFRONT_PORCH GENMASK(31, 16) |
137 | -#define HIBMC_DP_CFG_STREAM_VSYNC_WIDTH GENMASK(15, 0) | 137 | -#define HIBMC_DP_CFG_STREAM_VSYNC_WIDTH GENMASK(15, 0) |
138 | -#define HIBMC_DP_CFG_STREAM_VSTART GENMASK(31, 16) | 138 | -#define HIBMC_DP_CFG_STREAM_VSTART GENMASK(31, 16) |
139 | -#define HIBMC_DP_CFG_STREAM_HSTART GENMASK(15, 0) | 139 | -#define HIBMC_DP_CFG_STREAM_HSTART GENMASK(15, 0) |
140 | -#define HIBMC_DP_CFG_STREAM_VSYNC_POLARITY BIT(8) | 140 | -#define HIBMC_DP_CFG_STREAM_VSYNC_POLARITY BIT(8) |
141 | -#define HIBMC_DP_CFG_STREAM_HSYNC_POLARITY BIT(7) | 141 | -#define HIBMC_DP_CFG_STREAM_HSYNC_POLARITY BIT(7) |
142 | -#define HIBMC_DP_CFG_STREAM_RGB_ENABLE BIT(1) | 142 | -#define HIBMC_DP_CFG_STREAM_RGB_ENABLE BIT(1) |
143 | -#define HIBMC_DP_CFG_STREAM_VIDEO_MAPPING GENMASK(5, 2) | 143 | -#define HIBMC_DP_CFG_STREAM_VIDEO_MAPPING GENMASK(5, 2) |
144 | +#define HIBMC_DP_TIMING_MODEL_CTRL 0x884 | 144 | +#define HIBMC_DP_TIMING_MODEL_CTRL 0x884 |
145 | #define HIBMC_DP_CFG_PIXEL_NUM_TIMING_MODE_SEL1 GENMASK(31, 16) | 145 | #define HIBMC_DP_CFG_PIXEL_NUM_TIMING_MODE_SEL1 GENMASK(31, 16) |
146 | -#define HIBMC_DP_CFG_STREAM_TU_SYMBOL_SIZE GENMASK(5, 0) | 146 | -#define HIBMC_DP_CFG_STREAM_TU_SYMBOL_SIZE GENMASK(5, 0) |
147 | -#define HIBMC_DP_CFG_STREAM_TU_SYMBOL_FRAC_SIZE GENMASK(9, 6) | 147 | -#define HIBMC_DP_CFG_STREAM_TU_SYMBOL_FRAC_SIZE GENMASK(9, 6) |
148 | -#define HIBMC_DP_CFG_STREAM_HTOTAL_SIZE GENMASK(31, 16) | 148 | -#define HIBMC_DP_CFG_STREAM_HTOTAL_SIZE GENMASK(31, 16) |
149 | -#define HIBMC_DP_CFG_STREAM_HBLANK_SIZE GENMASK(15, 0) | 149 | -#define HIBMC_DP_CFG_STREAM_HBLANK_SIZE GENMASK(15, 0) |
150 | + | 150 | + |
151 | +#define HIBMC_DP_TIMING_SYNC_CTRL 0xFF0 | 151 | +#define HIBMC_DP_TIMING_SYNC_CTRL 0xFF0 |
152 | 152 | ||
153 | #endif | 153 | #endif |
154 | -- | 154 | -- |
155 | 2.33.0 | 155 | 2.33.0 | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
12 | For voltage and pre-emphasis levels changing, we can cfg different | 12 | For voltage and pre-emphasis levels changing, we can cfg different |
13 | serdes ffe value. | 13 | serdes ffe value. |
14 | 14 | ||
15 | Signed-off-by: Baihan Li <libaihan@huawei.com> | 15 | Signed-off-by: Baihan Li <libaihan@huawei.com> |
16 | Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> | 16 | Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> |
17 | Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> | ||
17 | --- | 18 | --- |
18 | ChangeLog: | 19 | ChangeLog: |
20 | v5 -> v6: | ||
21 | - fix the DP_SERDES_VOL2_PRE0 value after electrical test. | ||
19 | v3 -> v4: | 22 | v3 -> v4: |
20 | - fix the serdes cfg in hibmc_dp_serdes_set_tx_cfg(), suggested by Dmitry Baryshkov. | 23 | - fix the serdes cfg in hibmc_dp_serdes_set_tx_cfg(), suggested by Dmitry Baryshkov. |
21 | - move the dp serdes registers to dp_reg.h, suggested by Dmitry Baryshkov. | 24 | - move the dp serdes registers to dp_reg.h, suggested by Dmitry Baryshkov. |
22 | - | 25 | - |
23 | v2 -> v3: | 26 | v2 -> v3: |
... | ... | ||
117 | +#define DP_SERDES_VOL0_PRE2 0x53c0 | 120 | +#define DP_SERDES_VOL0_PRE2 0x53c0 |
118 | +#define DP_SERDES_VOL0_PRE3 0x8400 | 121 | +#define DP_SERDES_VOL0_PRE3 0x8400 |
119 | +#define DP_SERDES_VOL1_PRE0 0x380 | 122 | +#define DP_SERDES_VOL1_PRE0 0x380 |
120 | +#define DP_SERDES_VOL1_PRE1 0x3440 | 123 | +#define DP_SERDES_VOL1_PRE1 0x3440 |
121 | +#define DP_SERDES_VOL1_PRE2 0x6480 | 124 | +#define DP_SERDES_VOL1_PRE2 0x6480 |
122 | +#define DP_SERDES_VOL2_PRE0 0x500 | 125 | +#define DP_SERDES_VOL2_PRE0 0x4c1 |
123 | +#define DP_SERDES_VOL2_PRE1 0x4500 | 126 | +#define DP_SERDES_VOL2_PRE1 0x4500 |
124 | +#define DP_SERDES_VOL3_PRE0 0x600 | 127 | +#define DP_SERDES_VOL3_PRE0 0x600 |
125 | +#define DP_SERDES_BW_8_1 0x3 | 128 | +#define DP_SERDES_BW_8_1 0x3 |
126 | + | 129 | + |
127 | #endif | 130 | #endif |
... | ... | diff view generated by jsdifflib |
1 | From: Baihan Li <libaihan@huawei.com> | 1 | From: Baihan Li <libaihan@huawei.com> |
---|---|---|---|
2 | 2 | ||
3 | Add dp serdes cfg in link training process, and related adapting | 3 | Add dp serdes cfg in link training process, and related adapting |
4 | and modificating. Change some init values about training, | 4 | and modificating. Change some init values about training, because we want |
5 | because we want completely to negotiation process, so we start with | 5 | completely to negotiation process, so we start with the maximum rate and |
6 | the maximum rate and the electrical characteristic level is 0. | 6 | the electrical characteristic level is 0. Because serdes default cfgs is |
7 | changed and used in hibmc_kms_init(), we changed the if-statement to check | ||
8 | whether the value is 0. | ||
7 | 9 | ||
8 | Signed-off-by: Baihan Li <libaihan@huawei.com> | 10 | Signed-off-by: Baihan Li <libaihan@huawei.com> |
9 | Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> | 11 | Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> |
12 | Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> | ||
10 | --- | 13 | --- |
11 | ChangeLog: | 14 | ChangeLog: |
15 | v4 -> v5: | ||
16 | - add commit log about hibmc_kms_init(), suggested by Dmitry Baryshkov. | ||
17 | - fix the format of block comments, suggested by Dmitry Baryshkov. | ||
18 | - add hibmc_dp_get_serdes_rate_cfg() to correct transferring serdes cfg. | ||
12 | v3 -> v4: | 19 | v3 -> v4: |
13 | - add comments for if-statement of dp_init(), suggested by Dmitry Baryshkov. | 20 | - add comments for if-statement of dp_init(), suggested by Dmitry Baryshkov. |
14 | v2 -> v3: | 21 | v2 -> v3: |
15 | - change commit to an imperative sentence, suggested by Dmitry Baryshkov. | 22 | - change commit to an imperative sentence, suggested by Dmitry Baryshkov. |
16 | - put HIBMC_DP_HOST_SERDES_CTRL in dp_serdes.h, suggested by Dmitry Baryshkov. | 23 | - put HIBMC_DP_HOST_SERDES_CTRL in dp_serdes.h, suggested by Dmitry Baryshkov. |
17 | v1 -> v2: | 24 | v1 -> v2: |
18 | - splittting the patch and add more detailed the changes in the commit message, suggested by Dmitry Baryshkov. | 25 | - splittting the patch and add more detailed the changes in the commit message, suggested by Dmitry Baryshkov. |
19 | --- | 26 | --- |
20 | 1 | 0 | ||
21 | .../gpu/drm/hisilicon/hibmc/dp/dp_config.h | 1 + | 27 | .../gpu/drm/hisilicon/hibmc/dp/dp_config.h | 1 + |
22 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_hw.c | 5 ++- | 28 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_hw.c | 5 +- |
23 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c | 32 ++++++++++++++++--- | 29 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c | 77 ++++++++++++++----- |
24 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h | 5 +++ | 30 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h | 5 ++ |
25 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 12 +++---- | 31 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 13 ++-- |
26 | 6 files changed, 43 insertions(+), 12 deletions(-) | 32 | 5 files changed, 75 insertions(+), 26 deletions(-) |
27 | create mode 100644 1 | ||
28 | 33 | ||
29 | diff --git a/1 b/1 | ||
30 | new file mode 100644 | ||
31 | index XXXXXXX..XXXXXXX | ||
32 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_config.h b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_config.h | 34 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_config.h b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_config.h |
33 | index XXXXXXX..XXXXXXX 100644 | 35 | index XXXXXXX..XXXXXXX 100644 |
34 | --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_config.h | 36 | --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_config.h |
35 | +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_config.h | 37 | +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_config.h |
36 | @@ -XXX,XX +XXX,XX @@ | 38 | @@ -XXX,XX +XXX,XX @@ |
... | ... | ||
65 | writel(HIBMC_DP_HDCP, dp_dev->base + HIBMC_DP_HDCP_CFG); | 67 | writel(HIBMC_DP_HDCP, dp_dev->base + HIBMC_DP_HDCP_CFG); |
66 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c | 68 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c |
67 | index XXXXXXX..XXXXXXX 100644 | 69 | index XXXXXXX..XXXXXXX 100644 |
68 | --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c | 70 | --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c |
69 | +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c | 71 | +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c |
72 | @@ -XXX,XX +XXX,XX @@ | ||
73 | |||
74 | #define HIBMC_EQ_MAX_RETRY 5 | ||
75 | |||
76 | +static inline int hibmc_dp_get_serdes_rate_cfg(struct hibmc_dp_dev *dp) | ||
77 | +{ | ||
78 | + switch (dp->link.cap.link_rate) { | ||
79 | + case DP_LINK_BW_1_62: | ||
80 | + return DP_SERDES_BW_1_62; | ||
81 | + case DP_LINK_BW_2_7: | ||
82 | + return DP_SERDES_BW_2_7; | ||
83 | + case DP_LINK_BW_5_4: | ||
84 | + return DP_SERDES_BW_5_4; | ||
85 | + case DP_LINK_BW_8_1: | ||
86 | + return DP_SERDES_BW_8_1; | ||
87 | + default: | ||
88 | + return -EINVAL; | ||
89 | + } | ||
90 | +} | ||
91 | + | ||
92 | static int hibmc_dp_link_training_configure(struct hibmc_dp_dev *dp) | ||
93 | { | ||
94 | u8 buf[2]; | ||
95 | @@ -XXX,XX +XXX,XX @@ static int hibmc_dp_link_training_configure(struct hibmc_dp_dev *dp) | ||
96 | return ret >= 0 ? -EIO : ret; | ||
97 | } | ||
98 | |||
99 | - ret = drm_dp_read_dpcd_caps(&dp->aux, dp->dpcd); | ||
100 | - if (ret) | ||
101 | - drm_err(dp->dev, "dp aux read dpcd failed, ret: %d\n", ret); | ||
102 | - | ||
103 | - return ret; | ||
104 | + return 0; | ||
105 | } | ||
106 | |||
107 | static int hibmc_dp_link_set_pattern(struct hibmc_dp_dev *dp, int pattern) | ||
70 | @@ -XXX,XX +XXX,XX @@ static int hibmc_dp_link_training_cr_pre(struct hibmc_dp_dev *dp) | 108 | @@ -XXX,XX +XXX,XX @@ static int hibmc_dp_link_training_cr_pre(struct hibmc_dp_dev *dp) |
71 | return ret; | 109 | return ret; |
72 | 110 | ||
73 | for (i = 0; i < dp->link.cap.lanes; i++) | 111 | for (i = 0; i < dp->link.cap.lanes; i++) |
74 | - train_set[i] = DP_TRAIN_VOLTAGE_SWING_LEVEL_2; | 112 | - train_set[i] = DP_TRAIN_VOLTAGE_SWING_LEVEL_2; |
... | ... | ||
85 | } | 123 | } |
86 | 124 | ||
87 | -static inline int hibmc_dp_link_reduce_rate(struct hibmc_dp_dev *dp) | 125 | -static inline int hibmc_dp_link_reduce_rate(struct hibmc_dp_dev *dp) |
88 | +static int hibmc_dp_link_reduce_rate(struct hibmc_dp_dev *dp) | 126 | +static int hibmc_dp_link_reduce_rate(struct hibmc_dp_dev *dp) |
89 | { | 127 | { |
90 | + u8 rate = 0; | 128 | - switch (dp->link.cap.link_rate) { |
91 | + | 129 | - case DP_LINK_BW_2_7: |
92 | switch (dp->link.cap.link_rate) { | 130 | - dp->link.cap.link_rate = DP_LINK_BW_1_62; |
93 | case DP_LINK_BW_2_7: | ||
94 | dp->link.cap.link_rate = DP_LINK_BW_1_62; | ||
95 | - return 0; | 131 | - return 0; |
96 | + rate = DP_SERDES_BW_1_62; | 132 | - case DP_LINK_BW_5_4: |
97 | + break; | 133 | - dp->link.cap.link_rate = DP_LINK_BW_2_7; |
98 | case DP_LINK_BW_5_4: | ||
99 | dp->link.cap.link_rate = DP_LINK_BW_2_7; | ||
100 | - return 0; | 134 | - return 0; |
101 | + rate = DP_SERDES_BW_2_7; | 135 | - case DP_LINK_BW_8_1: |
102 | + break; | 136 | - dp->link.cap.link_rate = DP_LINK_BW_5_4; |
103 | case DP_LINK_BW_8_1: | ||
104 | dp->link.cap.link_rate = DP_LINK_BW_5_4; | ||
105 | - return 0; | 137 | - return 0; |
106 | + rate = DP_SERDES_BW_5_4; | 138 | - default: |
107 | + break; | 139 | + int ret; |
108 | default: | 140 | + |
141 | + if (dp->link.cap.link_rate == DP_LINK_BW_1_62) | ||
109 | return -EINVAL; | 142 | return -EINVAL; |
110 | } | 143 | - } |
111 | + | 144 | + |
112 | + return hibmc_dp_serdes_rate_switch(rate, dp); | 145 | + ret = hibmc_dp_get_serdes_rate_cfg(dp); |
113 | } | 146 | + if (ret < 0) |
147 | + return ret; | ||
148 | + | ||
149 | + return hibmc_dp_serdes_rate_switch(--ret, dp); | ||
150 | } | ||
114 | 151 | ||
115 | static inline int hibmc_dp_link_reduce_lane(struct hibmc_dp_dev *dp) | 152 | static inline int hibmc_dp_link_reduce_lane(struct hibmc_dp_dev *dp) |
116 | @@ -XXX,XX +XXX,XX @@ static inline int hibmc_dp_link_reduce_lane(struct hibmc_dp_dev *dp) | 153 | @@ -XXX,XX +XXX,XX @@ static inline int hibmc_dp_link_reduce_lane(struct hibmc_dp_dev *dp) |
117 | switch (dp->link.cap.lanes) { | 154 | switch (dp->link.cap.lanes) { |
118 | case 0x2: | 155 | case 0x2: |
... | ... | ||
143 | + return ret; | 180 | + return ret; |
144 | + | 181 | + |
145 | ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, | 182 | ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, |
146 | dp->link.train_set, dp->link.cap.lanes); | 183 | dp->link.train_set, dp->link.cap.lanes); |
147 | if (ret != dp->link.cap.lanes) { | 184 | if (ret != dp->link.cap.lanes) { |
185 | @@ -XXX,XX +XXX,XX @@ int hibmc_dp_link_training(struct hibmc_dp_dev *dp) | ||
186 | struct hibmc_dp_link *link = &dp->link; | ||
187 | int ret; | ||
188 | |||
189 | + ret = drm_dp_read_dpcd_caps(&dp->aux, dp->dpcd); | ||
190 | + if (ret) | ||
191 | + drm_err(dp->dev, "dp aux read dpcd failed, ret: %d\n", ret); | ||
192 | + | ||
193 | + dp->link.cap.link_rate = dp->dpcd[DP_MAX_LINK_RATE]; | ||
194 | + dp->link.cap.lanes = 0x2; | ||
195 | + | ||
196 | + ret = hibmc_dp_get_serdes_rate_cfg(dp); | ||
197 | + if (ret < 0) | ||
198 | + return ret; | ||
199 | + | ||
200 | + ret = hibmc_dp_serdes_rate_switch(ret, dp); | ||
201 | + if (ret) | ||
202 | + return ret; | ||
203 | + | ||
204 | while (true) { | ||
205 | ret = hibmc_dp_link_training_cr_pre(dp); | ||
206 | if (ret) | ||
148 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h | 207 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h |
149 | index XXXXXXX..XXXXXXX 100644 | 208 | index XXXXXXX..XXXXXXX 100644 |
150 | --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h | 209 | --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h |
151 | +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h | 210 | +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h |
152 | @@ -XXX,XX +XXX,XX @@ | 211 | @@ -XXX,XX +XXX,XX @@ |
... | ... | ||
194 | } | 253 | } |
195 | 254 | ||
196 | - /* if DP existed, init DP */ | 255 | - /* if DP existed, init DP */ |
197 | - if ((readl(priv->mmio + HIBMC_DP_HOST_SERDES_CTRL) & | 256 | - if ((readl(priv->mmio + HIBMC_DP_HOST_SERDES_CTRL) & |
198 | - HIBMC_DP_HOST_SERDES_CTRL_MASK) == HIBMC_DP_HOST_SERDES_CTRL_VAL) { | 257 | - HIBMC_DP_HOST_SERDES_CTRL_MASK) == HIBMC_DP_HOST_SERDES_CTRL_VAL) { |
199 | + /* if the serdes reg is readable and is not equal to 0, | 258 | + /* |
200 | + * DP existed, and init DP. | 259 | + * If the serdes reg is readable and is not equal to 0, |
260 | + * DP block exists and initializes it. | ||
201 | + */ | 261 | + */ |
202 | + ret = readl(priv->mmio + HIBMC_DP_HOST_SERDES_CTRL); | 262 | + ret = readl(priv->mmio + HIBMC_DP_HOST_SERDES_CTRL); |
203 | + if (ret) { | 263 | + if (ret) { |
204 | ret = hibmc_dp_init(priv); | 264 | ret = hibmc_dp_init(priv); |
205 | if (ret) | 265 | if (ret) |
206 | drm_err(dev, "failed to init dp: %d\n", ret); | 266 | drm_err(dev, "failed to init dp: %d\n", ret); |
207 | -- | 267 | -- |
208 | 2.33.0 | 268 | 2.33.0 | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
147 | - ret = drm_dp_dpcd_write(&dp->aux, DP_DOWNSPREAD_CTRL, buf, sizeof(buf)); | 147 | - ret = drm_dp_dpcd_write(&dp->aux, DP_DOWNSPREAD_CTRL, buf, sizeof(buf)); |
148 | + ret = drm_dp_dpcd_write(dp->aux, DP_DOWNSPREAD_CTRL, buf, sizeof(buf)); | 148 | + ret = drm_dp_dpcd_write(dp->aux, DP_DOWNSPREAD_CTRL, buf, sizeof(buf)); |
149 | if (ret != sizeof(buf)) { | 149 | if (ret != sizeof(buf)) { |
150 | drm_dbg_dp(dp->dev, "dp aux write 8b/10b and downspread failed, ret: %d\n", ret); | 150 | drm_dbg_dp(dp->dev, "dp aux write 8b/10b and downspread failed, ret: %d\n", ret); |
151 | return ret >= 0 ? -EIO : ret; | 151 | return ret >= 0 ? -EIO : ret; |
152 | } | ||
153 | |||
154 | - ret = drm_dp_read_dpcd_caps(&dp->aux, dp->dpcd); | ||
155 | + ret = drm_dp_read_dpcd_caps(dp->aux, dp->dpcd); | ||
156 | if (ret) | ||
157 | drm_err(dp->dev, "dp aux read dpcd failed, ret: %d\n", ret); | ||
158 | |||
159 | @@ -XXX,XX +XXX,XX @@ static int hibmc_dp_link_set_pattern(struct hibmc_dp_dev *dp, int pattern) | 152 | @@ -XXX,XX +XXX,XX @@ static int hibmc_dp_link_set_pattern(struct hibmc_dp_dev *dp, int pattern) |
160 | 153 | ||
161 | hibmc_dp_reg_write_field(dp, HIBMC_DP_PHYIF_CTRL0, HIBMC_DP_CFG_PAT_SEL, val); | 154 | hibmc_dp_reg_write_field(dp, HIBMC_DP_PHYIF_CTRL0, HIBMC_DP_CFG_PAT_SEL, val); |
162 | 155 | ||
163 | - ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_PATTERN_SET, &buf, sizeof(buf)); | 156 | - ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_PATTERN_SET, &buf, sizeof(buf)); |
... | ... | ||
214 | - ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, | 207 | - ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, |
215 | + ret = drm_dp_dpcd_write(dp->aux, DP_TRAINING_LANE0_SET, | 208 | + ret = drm_dp_dpcd_write(dp->aux, DP_TRAINING_LANE0_SET, |
216 | dp->link.train_set, dp->link.cap.lanes); | 209 | dp->link.train_set, dp->link.cap.lanes); |
217 | if (ret != dp->link.cap.lanes) { | 210 | if (ret != dp->link.cap.lanes) { |
218 | drm_dbg_dp(dp->dev, "Update link training failed\n"); | 211 | drm_dbg_dp(dp->dev, "Update link training failed\n"); |
212 | @@ -XXX,XX +XXX,XX @@ int hibmc_dp_link_training(struct hibmc_dp_dev *dp) | ||
213 | struct hibmc_dp_link *link = &dp->link; | ||
214 | int ret; | ||
215 | |||
216 | - ret = drm_dp_read_dpcd_caps(&dp->aux, dp->dpcd); | ||
217 | + ret = drm_dp_read_dpcd_caps(dp->aux, dp->dpcd); | ||
218 | if (ret) | ||
219 | drm_err(dp->dev, "dp aux read dpcd failed, ret: %d\n", ret); | ||
220 | |||
219 | -- | 221 | -- |
220 | 2.33.0 | 222 | 2.33.0 | diff view generated by jsdifflib |
1 | From: Baihan Li <libaihan@huawei.com> | 1 | From: Baihan Li <libaihan@huawei.com> |
---|---|---|---|
2 | 2 | ||
3 | Add registering drm_aux and use it to get connector edid with drm | 3 | Add registering drm_aux and use it to get connector edid with drm |
4 | functions. Add ddc channel in connector initialization to put drm_aux | 4 | functions. Add ddc channel in connector initialization to put drm_aux |
5 | in drm_connector. And also add detect callback to detect connector | 5 | in drm_connector. |
6 | befored call connector_get_modes. | ||
7 | 6 | ||
8 | Signed-off-by: Baihan Li <libaihan@huawei.com> | 7 | Signed-off-by: Baihan Li <libaihan@huawei.com> |
9 | Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> | 8 | Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> |
10 | Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> | 9 | Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> |
11 | --- | 10 | --- |
12 | ChangeLog: | 11 | ChangeLog: |
12 | v7 -> v8: | ||
13 | - use drm_edid_read() in hibmc_dp_connector_get_modes(), suggested by Jani Nikula | ||
14 | v6 -> v7: | ||
15 | - add if statement about drm aux in hibmc_dp_connector_get_modes(), suggested by Jani Nikula | ||
16 | v5 -> v6: | ||
17 | - move the detect_ctx() to the patch 7/9. | ||
13 | v2 -> v3: | 18 | v2 -> v3: |
14 | - Capitalized EDID and AUX, suggested by Dmitry Baryshkov. | 19 | - Capitalized EDID and AUX, suggested by Dmitry Baryshkov. |
15 | v1 -> v2: | 20 | v1 -> v2: |
16 | - deleting type conversion, suggested by Dmitry Baryshkov. | 21 | - deleting type conversion, suggested by Dmitry Baryshkov. |
17 | - deleting hibmc_dp_connector_get_modes() and using drm_connector_helper_get_modes(), suggested by Dmitry Baryshkov. | 22 | - deleting hibmc_dp_connector_get_modes() and using drm_connector_helper_get_modes(), suggested by Dmitry Baryshkov. |
18 | --- | 23 | --- |
19 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c | 3 +- | 24 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c | 3 +- |
20 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 33 ++++++++++++++++--- | 25 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 31 ++++++++++++++++--- |
21 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 5 +++ | 26 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 5 +++ |
22 | 3 files changed, 35 insertions(+), 6 deletions(-) | 27 | 3 files changed, 33 insertions(+), 6 deletions(-) |
23 | 28 | ||
24 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c | 29 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c |
25 | index XXXXXXX..XXXXXXX 100644 | 30 | index XXXXXXX..XXXXXXX 100644 |
26 | --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c | 31 | --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c |
27 | +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c | 32 | +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c |
... | ... | ||
41 | +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 46 | +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c |
42 | @@ -XXX,XX +XXX,XX @@ | 47 | @@ -XXX,XX +XXX,XX @@ |
43 | 48 | ||
44 | static int hibmc_dp_connector_get_modes(struct drm_connector *connector) | 49 | static int hibmc_dp_connector_get_modes(struct drm_connector *connector) |
45 | { | 50 | { |
46 | + struct hibmc_dp *dp = to_hibmc_dp(connector); | ||
47 | + const struct drm_edid *drm_edid; | 51 | + const struct drm_edid *drm_edid; |
48 | int count; | 52 | int count; |
49 | 53 | ||
50 | - count = drm_add_modes_noedid(connector, connector->dev->mode_config.max_width, | 54 | - count = drm_add_modes_noedid(connector, connector->dev->mode_config.max_width, |
51 | - connector->dev->mode_config.max_height); | 55 | - connector->dev->mode_config.max_height); |
52 | - drm_set_preferred_mode(connector, 1024, 768); // temporary implementation | 56 | - drm_set_preferred_mode(connector, 1024, 768); // temporary implementation |
53 | + drm_edid = drm_edid_read_ddc(connector, &dp->aux.ddc); | 57 | + drm_edid = drm_edid_read(connector); |
54 | + | 58 | + |
55 | + drm_edid_connector_update(connector, drm_edid); | 59 | + drm_edid_connector_update(connector, drm_edid); |
56 | + | 60 | + |
57 | + count = drm_edid_connector_add_modes(connector); | 61 | + count = drm_edid_connector_add_modes(connector); |
58 | + | 62 | + |
59 | + drm_edid_free(drm_edid); | 63 | + drm_edid_free(drm_edid); |
60 | 64 | ||
61 | return count; | 65 | return count; |
62 | } | 66 | } |
63 | 67 | @@ -XXX,XX +XXX,XX @@ static const struct drm_connector_helper_funcs hibmc_dp_conn_helper_funcs = { | |
64 | static const struct drm_connector_helper_funcs hibmc_dp_conn_helper_funcs = { | ||
65 | .get_modes = hibmc_dp_connector_get_modes, | 68 | .get_modes = hibmc_dp_connector_get_modes, |
66 | + .detect_ctx = drm_connector_helper_detect_from_ddc, | ||
67 | }; | 69 | }; |
68 | 70 | ||
69 | +static int hibmc_dp_late_register(struct drm_connector *connector) | 71 | +static int hibmc_dp_late_register(struct drm_connector *connector) |
70 | +{ | 72 | +{ |
71 | + struct hibmc_dp *dp = to_hibmc_dp(connector); | 73 | + struct hibmc_dp *dp = to_hibmc_dp(connector); |
... | ... | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
8 | echo: config the color bar register to display | 8 | echo: config the color bar register to display |
9 | cat: print the color bar configuration | 9 | cat: print the color bar configuration |
10 | 10 | ||
11 | Signed-off-by: Baihan Li <libaihan@huawei.com> | 11 | Signed-off-by: Baihan Li <libaihan@huawei.com> |
12 | Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> | 12 | Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> |
13 | Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> | ||
13 | --- | 14 | --- |
14 | ChangeLog: | 15 | ChangeLog: |
15 | v3 -> v4: | 16 | v3 -> v4: |
16 | - add comments in hibmc_control_write(), suggested by Dmitry Baryshkov. | 17 | - add comments in hibmc_control_write(), suggested by Dmitry Baryshkov. |
17 | v2 -> v3: | 18 | v2 -> v3: |
... | ... | diff view generated by jsdifflib |
1 | From: Baihan Li <libaihan@huawei.com> | 1 | From: Baihan Li <libaihan@huawei.com> |
---|---|---|---|
2 | 2 | ||
3 | Add HPD interrupt enable functions in drm framework. Add link reset | 3 | Add HPD interrupt enable functions in drm framework, and also add |
4 | process to reset link status when a new connector pulgged in. Because the | 4 | detect_ctx functions. Because of the debouncing when HPD pulled out, |
5 | connected VGA connector would make driver can't get the userspace | 5 | add 200 ms delay in detect. Add link reset process to reset link status |
6 | call, adding detect_ctx in vga connector to make HPD active userspace. | 6 | when a new connector pulgged in. |
7 | 7 | ||
8 | Signed-off-by: Baihan Li <libaihan@huawei.com> | 8 | Signed-off-by: Baihan Li <libaihan@huawei.com> |
9 | Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> | 9 | Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> |
10 | Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> | ||
10 | --- | 11 | --- |
11 | ChangeLog: | 12 | ChangeLog: |
13 | v5 -> v6: | ||
14 | - add detect_ctx with 200ms delay, suggested by Dmitry Baryshkov. | ||
15 | v4 -> v5: | ||
16 | - separate the vga part commit, suggested by Dmitry Baryshkov. | ||
12 | v3 -> v4: | 17 | v3 -> v4: |
13 | - add link reset of rates and lanes in pre link training process, suggested by Dmitry Baryshkov. | 18 | - add link reset of rates and lanes in pre link training process, suggested by Dmitry Baryshkov. |
14 | - add vdac detect and connected/disconnected status to enable HPD process, suggested by Dmitry Baryshkov. | 19 | - add vdac detect and connected/disconnected status to enable HPD process, suggested by Dmitry Baryshkov. |
15 | - remove a drm_client, suggested by Dmitry Baryshkov. | 20 | - remove a drm_client, suggested by Dmitry Baryshkov. |
16 | - fix build errors reported by kernel test robot <lkp@intel.com> | 21 | - fix build errors reported by kernel test robot <lkp@intel.com> |
... | ... | ||
28 | - optimizing the description in commit message, suggested by Dmitry Baryshkov. | 33 | - optimizing the description in commit message, suggested by Dmitry Baryshkov. |
29 | - add mdelay(100) comments, suggested by Dmitry Baryshkov. | 34 | - add mdelay(100) comments, suggested by Dmitry Baryshkov. |
30 | - deleting display enable in hpd event, suggested by Dmitry Baryshkov. | 35 | - deleting display enable in hpd event, suggested by Dmitry Baryshkov. |
31 | --- | 36 | --- |
32 | .../gpu/drm/hisilicon/hibmc/dp/dp_config.h | 1 + | 37 | .../gpu/drm/hisilicon/hibmc/dp/dp_config.h | 1 + |
33 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_hw.c | 36 +++++++++++++++++++ | 38 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_hw.c | 36 ++++++++++++++++ |
34 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_hw.h | 5 +++ | 39 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_hw.h | 5 +++ |
35 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c | 3 ++ | 40 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 42 +++++++++++++++++++ |
36 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 33 +++++++++++++++++ | 41 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 2 + |
37 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 2 ++ | 42 | 5 files changed, 86 insertions(+) |
38 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c | 3 ++ | ||
39 | 7 files changed, 83 insertions(+) | ||
40 | 43 | ||
41 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_config.h b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_config.h | 44 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_config.h b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_config.h |
42 | index XXXXXXX..XXXXXXX 100644 | 45 | index XXXXXXX..XXXXXXX 100644 |
43 | --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_config.h | 46 | --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_config.h |
44 | +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_config.h | 47 | +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_config.h |
... | ... | ||
122 | +void hibmc_dp_hpd_cfg(struct hibmc_dp *dp); | 125 | +void hibmc_dp_hpd_cfg(struct hibmc_dp *dp); |
123 | +void hibmc_dp_enable_int(struct hibmc_dp *dp); | 126 | +void hibmc_dp_enable_int(struct hibmc_dp *dp); |
124 | +void hibmc_dp_disable_int(struct hibmc_dp *dp); | 127 | +void hibmc_dp_disable_int(struct hibmc_dp *dp); |
125 | 128 | ||
126 | #endif | 129 | #endif |
127 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c | ||
128 | index XXXXXXX..XXXXXXX 100644 | ||
129 | --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c | ||
130 | +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c | ||
131 | @@ -XXX,XX +XXX,XX @@ static int hibmc_dp_link_training_configure(struct hibmc_dp_dev *dp) | ||
132 | if (ret) | ||
133 | drm_err(dp->dev, "dp aux read dpcd failed, ret: %d\n", ret); | ||
134 | |||
135 | + dp->link.cap.link_rate = dp->dpcd[DP_MAX_LINK_RATE]; | ||
136 | + dp->link.cap.lanes = 0x2; | ||
137 | + | ||
138 | return ret; | ||
139 | } | ||
140 | |||
141 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 130 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c |
142 | index XXXXXXX..XXXXXXX 100644 | 131 | index XXXXXXX..XXXXXXX 100644 |
143 | --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 132 | --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c |
144 | +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 133 | +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c |
145 | @@ -XXX,XX +XXX,XX @@ | 134 | @@ -XXX,XX +XXX,XX @@ |
... | ... | ||
148 | 137 | ||
149 | +#define DP_MASKED_SINK_HPD_PLUG_INT BIT(2) | 138 | +#define DP_MASKED_SINK_HPD_PLUG_INT BIT(2) |
150 | + | 139 | + |
151 | static int hibmc_dp_connector_get_modes(struct drm_connector *connector) | 140 | static int hibmc_dp_connector_get_modes(struct drm_connector *connector) |
152 | { | 141 | { |
142 | const struct drm_edid *drm_edid; | ||
143 | @@ -XXX,XX +XXX,XX @@ static int hibmc_dp_connector_get_modes(struct drm_connector *connector) | ||
144 | return count; | ||
145 | } | ||
146 | |||
147 | +static int hibmc_dp_detect(struct drm_connector *connector, | ||
148 | + struct drm_modeset_acquire_ctx *ctx, bool force) | ||
149 | +{ | ||
150 | + mdelay(200); | ||
151 | + | ||
152 | + return drm_connector_helper_detect_from_ddc(connector, ctx, force); | ||
153 | +} | ||
154 | + | ||
155 | static const struct drm_connector_helper_funcs hibmc_dp_conn_helper_funcs = { | ||
156 | .get_modes = hibmc_dp_connector_get_modes, | ||
157 | + .detect_ctx = hibmc_dp_detect, | ||
158 | }; | ||
159 | |||
160 | static int hibmc_dp_late_register(struct drm_connector *connector) | ||
161 | { | ||
153 | struct hibmc_dp *dp = to_hibmc_dp(connector); | 162 | struct hibmc_dp *dp = to_hibmc_dp(connector); |
154 | @@ -XXX,XX +XXX,XX @@ static int hibmc_dp_late_register(struct drm_connector *connector) | ||
155 | { | ||
156 | struct hibmc_dp *dp = to_hibmc_dp(connector); | ||
157 | 163 | ||
158 | + hibmc_dp_enable_int(dp); | 164 | + hibmc_dp_enable_int(dp); |
159 | + | 165 | + |
160 | return drm_dp_aux_register(&dp->aux); | 166 | return drm_dp_aux_register(&dp->aux); |
161 | } | 167 | } |
... | ... | ||
218 | void hibmc_debugfs_init(struct drm_connector *connector, struct dentry *root); | 224 | void hibmc_debugfs_init(struct drm_connector *connector, struct dentry *root); |
219 | 225 | ||
220 | +irqreturn_t hibmc_dp_hpd_isr(int irq, void *arg); | 226 | +irqreturn_t hibmc_dp_hpd_isr(int irq, void *arg); |
221 | + | 227 | + |
222 | #endif | 228 | #endif |
223 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c | ||
224 | index XXXXXXX..XXXXXXX 100644 | ||
225 | --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c | ||
226 | +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c | ||
227 | @@ -XXX,XX +XXX,XX @@ static void hibmc_connector_destroy(struct drm_connector *connector) | ||
228 | static const struct drm_connector_helper_funcs | ||
229 | hibmc_connector_helper_funcs = { | ||
230 | .get_modes = hibmc_connector_get_modes, | ||
231 | + .detect_ctx = drm_connector_helper_detect_from_ddc, | ||
232 | }; | ||
233 | |||
234 | static const struct drm_connector_funcs hibmc_connector_funcs = { | ||
235 | @@ -XXX,XX +XXX,XX @@ int hibmc_vdac_init(struct hibmc_drm_private *priv) | ||
236 | |||
237 | drm_connector_attach_encoder(connector, encoder); | ||
238 | |||
239 | + connector->polled = DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT; | ||
240 | + | ||
241 | return 0; | ||
242 | } | ||
243 | -- | 229 | -- |
244 | 2.33.0 | 230 | 2.33.0 | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
6 | 6 | ||
7 | Signed-off-by: Baihan Li <libaihan@huawei.com> | 7 | Signed-off-by: Baihan Li <libaihan@huawei.com> |
8 | Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> | 8 | Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> |
9 | Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> | 9 | Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> |
10 | --- | 10 | --- |
11 | ChangeLog: | ||
12 | v4 -> v5: | ||
13 | - remove pci_disable_msi() in hibmc_unload() | ||
14 | --- | ||
11 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h | 3 + | 15 | drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h | 3 + |
12 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 76 +++++++++++++++---- | 16 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 74 +++++++++++++++---- |
13 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 3 + | 17 | .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 3 + |
14 | 3 files changed, 68 insertions(+), 14 deletions(-) | 18 | 3 files changed, 66 insertions(+), 14 deletions(-) |
15 | 19 | ||
16 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h | 20 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h |
17 | index XXXXXXX..XXXXXXX 100644 | 21 | index XXXXXXX..XXXXXXX 100644 |
18 | --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h | 22 | --- a/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h |
19 | +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h | 23 | +++ b/drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h |
... | ... | ||
71 | +static void hibmc_unload(struct drm_device *dev) | 75 | +static void hibmc_unload(struct drm_device *dev) |
72 | { | 76 | { |
73 | - struct pci_dev *pdev = to_pci_dev(dev->dev); | 77 | - struct pci_dev *pdev = to_pci_dev(dev->dev); |
74 | - | 78 | - |
75 | drm_atomic_helper_shutdown(dev); | 79 | drm_atomic_helper_shutdown(dev); |
80 | +} | ||
76 | 81 | ||
77 | - free_irq(pdev->irq, dev); | 82 | - free_irq(pdev->irq, dev); |
78 | - | ||
79 | pci_disable_msi(to_pci_dev(dev->dev)); | ||
80 | +} | ||
81 | + | ||
82 | +static int hibmc_msi_init(struct drm_device *dev) | 83 | +static int hibmc_msi_init(struct drm_device *dev) |
83 | +{ | 84 | +{ |
84 | + struct pci_dev *pdev = to_pci_dev(dev->dev); | 85 | + struct pci_dev *pdev = to_pci_dev(dev->dev); |
85 | + char name[32] = {0}; | 86 | + char name[32] = {0}; |
86 | + int valid_irq_num; | 87 | + int valid_irq_num; |
87 | + int irq; | 88 | + int irq; |
88 | + int ret; | 89 | + int ret; |
89 | + | 90 | |
91 | - pci_disable_msi(to_pci_dev(dev->dev)); | ||
90 | + ret = pci_alloc_irq_vectors(pdev, HIBMC_MIN_VECTORS, | 92 | + ret = pci_alloc_irq_vectors(pdev, HIBMC_MIN_VECTORS, |
91 | + HIBMC_MAX_VECTORS, PCI_IRQ_MSI); | 93 | + HIBMC_MAX_VECTORS, PCI_IRQ_MSI); |
92 | + if (ret < 0) { | 94 | + if (ret < 0) { |
93 | + drm_err(dev, "enabling MSI failed: %d\n", ret); | 95 | + drm_err(dev, "enabling MSI failed: %d\n", ret); |
94 | + return ret; | 96 | + return ret; |
... | ... | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Baihan Li <libaihan@huawei.com> | ||
1 | 2 | ||
3 | Because the connected VGA connector would make driver can't get the | ||
4 | userspace call, adding detect_ctx in vga connector to make HPD active | ||
5 | userspace. | ||
6 | |||
7 | Signed-off-by: Baihan Li <libaihan@huawei.com> | ||
8 | Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> | ||
9 | Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> | ||
10 | --- | ||
11 | drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c | 3 +++ | ||
12 | 1 file changed, 3 insertions(+) | ||
13 | |||
14 | diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c | ||
15 | index XXXXXXX..XXXXXXX 100644 | ||
16 | --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c | ||
17 | +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c | ||
18 | @@ -XXX,XX +XXX,XX @@ static void hibmc_connector_destroy(struct drm_connector *connector) | ||
19 | static const struct drm_connector_helper_funcs | ||
20 | hibmc_connector_helper_funcs = { | ||
21 | .get_modes = hibmc_connector_get_modes, | ||
22 | + .detect_ctx = drm_connector_helper_detect_from_ddc, | ||
23 | }; | ||
24 | |||
25 | static const struct drm_connector_funcs hibmc_connector_funcs = { | ||
26 | @@ -XXX,XX +XXX,XX @@ int hibmc_vdac_init(struct hibmc_drm_private *priv) | ||
27 | |||
28 | drm_connector_attach_encoder(connector, encoder); | ||
29 | |||
30 | + connector->polled = DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT; | ||
31 | + | ||
32 | return 0; | ||
33 | } | ||
34 | -- | ||
35 | 2.33.0 | diff view generated by jsdifflib |