mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-13 09:20:17 +00:00
drm/msm/mdp5: Fix iteration on INTF config array
The current iteration in get_dsi_id_from_intf() is wrong: instead of iterating until hw_cfg->intf.count, we need to iterate until MDP5_INTF_NUM_MAX here. Let's take the example of msm8x16: hw_cfg->intf.count = 1 intfs[0] = INTF_Disabled intfs[1] = INTF_DSI If we stop iterating once i reaches hw_cfg->intf.count (== 1), we will miss the test for intfs[1]. Actually, this hw_cfg->intf.count entry is quite confusing and is not (or *should not be*) used anywhere else; let's remove it. Signed-off-by: Stephane Viau <sviau@codeaurora.org>
This commit is contained in:
parent
651ad3f52b
commit
fe34464df5
@ -72,14 +72,13 @@ const struct mdp5_cfg_hw msm8x74_config = {
|
|||||||
.base = { 0x12d00, 0x12e00, 0x12f00 },
|
.base = { 0x12d00, 0x12e00, 0x12f00 },
|
||||||
},
|
},
|
||||||
.intf = {
|
.intf = {
|
||||||
.count = 4,
|
|
||||||
.base = { 0x12500, 0x12700, 0x12900, 0x12b00 },
|
.base = { 0x12500, 0x12700, 0x12900, 0x12b00 },
|
||||||
},
|
.connect = {
|
||||||
.intfs = {
|
[0] = INTF_eDP,
|
||||||
[0] = INTF_eDP,
|
[1] = INTF_DSI,
|
||||||
[1] = INTF_DSI,
|
[2] = INTF_DSI,
|
||||||
[2] = INTF_DSI,
|
[3] = INTF_HDMI,
|
||||||
[3] = INTF_HDMI,
|
},
|
||||||
},
|
},
|
||||||
.max_clk = 200000000,
|
.max_clk = 200000000,
|
||||||
};
|
};
|
||||||
@ -142,14 +141,13 @@ const struct mdp5_cfg_hw apq8084_config = {
|
|||||||
.base = { 0x12f00, 0x13000, 0x13100, 0x13200 },
|
.base = { 0x12f00, 0x13000, 0x13100, 0x13200 },
|
||||||
},
|
},
|
||||||
.intf = {
|
.intf = {
|
||||||
.count = 5,
|
|
||||||
.base = { 0x12500, 0x12700, 0x12900, 0x12b00, 0x12d00 },
|
.base = { 0x12500, 0x12700, 0x12900, 0x12b00, 0x12d00 },
|
||||||
},
|
.connect = {
|
||||||
.intfs = {
|
[0] = INTF_eDP,
|
||||||
[0] = INTF_eDP,
|
[1] = INTF_DSI,
|
||||||
[1] = INTF_DSI,
|
[2] = INTF_DSI,
|
||||||
[2] = INTF_DSI,
|
[3] = INTF_HDMI,
|
||||||
[3] = INTF_HDMI,
|
},
|
||||||
},
|
},
|
||||||
.max_clk = 320000000,
|
.max_clk = 320000000,
|
||||||
};
|
};
|
||||||
@ -196,10 +194,12 @@ const struct mdp5_cfg_hw msm8x16_config = {
|
|||||||
|
|
||||||
},
|
},
|
||||||
.intf = {
|
.intf = {
|
||||||
.count = 1, /* INTF_1 */
|
.base = { 0x00000, 0x6b800 },
|
||||||
.base = { 0x6B800 },
|
.connect = {
|
||||||
|
[0] = INTF_DISABLED,
|
||||||
|
[1] = INTF_DSI,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
/* TODO enable .intfs[] with [1] = INTF_DSI, once DSI is implemented */
|
|
||||||
.max_clk = 320000000,
|
.max_clk = 320000000,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -59,6 +59,11 @@ struct mdp5_smp_block {
|
|||||||
|
|
||||||
#define MDP5_INTF_NUM_MAX 5
|
#define MDP5_INTF_NUM_MAX 5
|
||||||
|
|
||||||
|
struct mdp5_intf_block {
|
||||||
|
uint32_t base[MAX_BASES];
|
||||||
|
u32 connect[MDP5_INTF_NUM_MAX]; /* array of enum mdp5_intf_type */
|
||||||
|
};
|
||||||
|
|
||||||
struct mdp5_cfg_hw {
|
struct mdp5_cfg_hw {
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
@ -72,9 +77,7 @@ struct mdp5_cfg_hw {
|
|||||||
struct mdp5_sub_block dspp;
|
struct mdp5_sub_block dspp;
|
||||||
struct mdp5_sub_block ad;
|
struct mdp5_sub_block ad;
|
||||||
struct mdp5_sub_block pp;
|
struct mdp5_sub_block pp;
|
||||||
struct mdp5_sub_block intf;
|
struct mdp5_intf_block intf;
|
||||||
|
|
||||||
u32 intfs[MDP5_INTF_NUM_MAX]; /* array of enum mdp5_intf_type */
|
|
||||||
|
|
||||||
uint32_t max_clk;
|
uint32_t max_clk;
|
||||||
};
|
};
|
||||||
|
@ -206,8 +206,8 @@ static struct drm_encoder *construct_encoder(struct mdp5_kms *mdp5_kms,
|
|||||||
|
|
||||||
static int get_dsi_id_from_intf(const struct mdp5_cfg_hw *hw_cfg, int intf_num)
|
static int get_dsi_id_from_intf(const struct mdp5_cfg_hw *hw_cfg, int intf_num)
|
||||||
{
|
{
|
||||||
const int intf_cnt = hw_cfg->intf.count;
|
const enum mdp5_intf_type *intfs = hw_cfg->intf.connect;
|
||||||
const u32 *intfs = hw_cfg->intfs;
|
const int intf_cnt = ARRAY_SIZE(hw_cfg->intf.connect);
|
||||||
int id = 0, i;
|
int id = 0, i;
|
||||||
|
|
||||||
for (i = 0; i < intf_cnt; i++) {
|
for (i = 0; i < intf_cnt; i++) {
|
||||||
@ -228,7 +228,7 @@ static int modeset_init_intf(struct mdp5_kms *mdp5_kms, int intf_num)
|
|||||||
struct msm_drm_private *priv = dev->dev_private;
|
struct msm_drm_private *priv = dev->dev_private;
|
||||||
const struct mdp5_cfg_hw *hw_cfg =
|
const struct mdp5_cfg_hw *hw_cfg =
|
||||||
mdp5_cfg_get_hw_config(mdp5_kms->cfg);
|
mdp5_cfg_get_hw_config(mdp5_kms->cfg);
|
||||||
enum mdp5_intf_type intf_type = hw_cfg->intfs[intf_num];
|
enum mdp5_intf_type intf_type = hw_cfg->intf.connect[intf_num];
|
||||||
struct drm_encoder *encoder;
|
struct drm_encoder *encoder;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
@ -365,7 +365,7 @@ static int modeset_init(struct mdp5_kms *mdp5_kms)
|
|||||||
/* Construct encoders and modeset initialize connector devices
|
/* Construct encoders and modeset initialize connector devices
|
||||||
* for each external display interface.
|
* for each external display interface.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < ARRAY_SIZE(hw_cfg->intfs); i++) {
|
for (i = 0; i < ARRAY_SIZE(hw_cfg->intf.connect); i++) {
|
||||||
ret = modeset_init_intf(mdp5_kms, i);
|
ret = modeset_init_intf(mdp5_kms, i);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto fail;
|
goto fail;
|
||||||
@ -514,8 +514,8 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
|
|||||||
*/
|
*/
|
||||||
mdp5_enable(mdp5_kms);
|
mdp5_enable(mdp5_kms);
|
||||||
for (i = 0; i < MDP5_INTF_NUM_MAX; i++) {
|
for (i = 0; i < MDP5_INTF_NUM_MAX; i++) {
|
||||||
if (!config->hw->intf.base[i] ||
|
if (mdp5_cfg_intf_is_virtual(config->hw->intf.connect[i]) ||
|
||||||
mdp5_cfg_intf_is_virtual(config->hw->intfs[i]))
|
!config->hw->intf.base[i])
|
||||||
continue;
|
continue;
|
||||||
mdp5_write(mdp5_kms, REG_MDP5_INTF_TIMING_ENGINE_EN(i), 0);
|
mdp5_write(mdp5_kms, REG_MDP5_INTF_TIMING_ENGINE_EN(i), 0);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user