aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephane Viau <sviau@codeaurora.org>2015-03-09 09:11:04 -0400
committerRob Clark <robdclark@gmail.com>2015-04-01 19:29:36 -0400
commitf52538125e4dfb2a74f2efd915430d6fc39d0124 (patch)
tree9405664914de9acf8f00d7767b90230de6134f03
parentba474a02cb1009574a7cdcc29de9ca2d0b3c6df6 (diff)
drm/msm/mdp5: Separate MDP5 domain from MDSS domain
MDP block is actually contained inside the MDSS block. For some chipsets, the base address of the MDP registers is different from the current (assumed) 0x100 offset. Like CTL and LM blocks, this changes introduce a dynamic offset for the MDP instance, which can be found out at runtime, once the MDSS HW version is read. Signed-off-by: Stephane Viau <sviau@codeaurora.org> Signed-off-by: Rob Clark <robdclark@gmail.com>
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c8
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.h1
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.c20
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_irq.c26
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c9
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h2
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_smp.c20
7 files changed, 48 insertions, 38 deletions
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c
index 57d620b40240..4c570e646b74 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c
@@ -24,6 +24,10 @@ const struct mdp5_cfg_hw *mdp5_cfg = NULL;
24 24
25const struct mdp5_cfg_hw msm8x74_config = { 25const struct mdp5_cfg_hw msm8x74_config = {
26 .name = "msm8x74", 26 .name = "msm8x74",
27 .mdp = {
28 .count = 1,
29 .base = { 0x00100 },
30 },
27 .smp = { 31 .smp = {
28 .mmb_count = 22, 32 .mmb_count = 22,
29 .mmb_size = 4096, 33 .mmb_size = 4096,
@@ -75,6 +79,10 @@ const struct mdp5_cfg_hw msm8x74_config = {
75 79
76const struct mdp5_cfg_hw apq8084_config = { 80const struct mdp5_cfg_hw apq8084_config = {
77 .name = "apq8084", 81 .name = "apq8084",
82 .mdp = {
83 .count = 1,
84 .base = { 0x00100 },
85 },
78 .smp = { 86 .smp = {
79 .mmb_count = 44, 87 .mmb_count = 44,
80 .mmb_size = 8192, 88 .mmb_size = 8192,
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.h b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.h
index 93bee92e7d60..11f3e869e880 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.h
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.h
@@ -61,6 +61,7 @@ struct mdp5_smp_block {
61struct mdp5_cfg_hw { 61struct mdp5_cfg_hw {
62 char *name; 62 char *name;
63 63
64 struct mdp5_sub_block mdp;
64 struct mdp5_smp_block smp; 65 struct mdp5_smp_block smp;
65 struct mdp5_ctl_block ctl; 66 struct mdp5_ctl_block ctl;
66 struct mdp5_sub_block pipe_vig; 67 struct mdp5_sub_block pipe_vig;
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.c
index 7c0adf54e3e5..0fa7fcefd7eb 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.c
@@ -112,31 +112,31 @@ static void set_display_intf(struct mdp5_kms *mdp5_kms,
112 u32 intf_sel; 112 u32 intf_sel;
113 113
114 spin_lock_irqsave(&mdp5_kms->resource_lock, flags); 114 spin_lock_irqsave(&mdp5_kms->resource_lock, flags);
115 intf_sel = mdp5_read(mdp5_kms, REG_MDP5_DISP_INTF_SEL); 115 intf_sel = mdp5_read(mdp5_kms, REG_MDP5_MDP_DISP_INTF_SEL(0));
116 116
117 switch (intf->num) { 117 switch (intf->num) {
118 case 0: 118 case 0:
119 intf_sel &= ~MDP5_DISP_INTF_SEL_INTF0__MASK; 119 intf_sel &= ~MDP5_MDP_DISP_INTF_SEL_INTF0__MASK;
120 intf_sel |= MDP5_DISP_INTF_SEL_INTF0(intf->type); 120 intf_sel |= MDP5_MDP_DISP_INTF_SEL_INTF0(intf->type);
121 break; 121 break;
122 case 1: 122 case 1:
123 intf_sel &= ~MDP5_DISP_INTF_SEL_INTF1__MASK; 123 intf_sel &= ~MDP5_MDP_DISP_INTF_SEL_INTF1__MASK;
124 intf_sel |= MDP5_DISP_INTF_SEL_INTF1(intf->type); 124 intf_sel |= MDP5_MDP_DISP_INTF_SEL_INTF1(intf->type);
125 break; 125 break;
126 case 2: 126 case 2:
127 intf_sel &= ~MDP5_DISP_INTF_SEL_INTF2__MASK; 127 intf_sel &= ~MDP5_MDP_DISP_INTF_SEL_INTF2__MASK;
128 intf_sel |= MDP5_DISP_INTF_SEL_INTF2(intf->type); 128 intf_sel |= MDP5_MDP_DISP_INTF_SEL_INTF2(intf->type);
129 break; 129 break;
130 case 3: 130 case 3:
131 intf_sel &= ~MDP5_DISP_INTF_SEL_INTF3__MASK; 131 intf_sel &= ~MDP5_MDP_DISP_INTF_SEL_INTF3__MASK;
132 intf_sel |= MDP5_DISP_INTF_SEL_INTF3(intf->type); 132 intf_sel |= MDP5_MDP_DISP_INTF_SEL_INTF3(intf->type);
133 break; 133 break;
134 default: 134 default:
135 BUG(); 135 BUG();
136 break; 136 break;
137 } 137 }
138 138
139 mdp5_write(mdp5_kms, REG_MDP5_DISP_INTF_SEL, intf_sel); 139 mdp5_write(mdp5_kms, REG_MDP5_MDP_DISP_INTF_SEL(0), intf_sel);
140 spin_unlock_irqrestore(&mdp5_kms->resource_lock, flags); 140 spin_unlock_irqrestore(&mdp5_kms->resource_lock, flags);
141} 141}
142 142
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_irq.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_irq.c
index a9407105b9b7..33bd4c6160dd 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_irq.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_irq.c
@@ -23,7 +23,7 @@
23 23
24void mdp5_set_irqmask(struct mdp_kms *mdp_kms, uint32_t irqmask) 24void mdp5_set_irqmask(struct mdp_kms *mdp_kms, uint32_t irqmask)
25{ 25{
26 mdp5_write(to_mdp5_kms(mdp_kms), REG_MDP5_INTR_EN, irqmask); 26 mdp5_write(to_mdp5_kms(mdp_kms), REG_MDP5_MDP_INTR_EN(0), irqmask);
27} 27}
28 28
29static void mdp5_irq_error_handler(struct mdp_irq *irq, uint32_t irqstatus) 29static void mdp5_irq_error_handler(struct mdp_irq *irq, uint32_t irqstatus)
@@ -35,8 +35,8 @@ void mdp5_irq_preinstall(struct msm_kms *kms)
35{ 35{
36 struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms)); 36 struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms));
37 mdp5_enable(mdp5_kms); 37 mdp5_enable(mdp5_kms);
38 mdp5_write(mdp5_kms, REG_MDP5_INTR_CLEAR, 0xffffffff); 38 mdp5_write(mdp5_kms, REG_MDP5_MDP_INTR_CLEAR(0), 0xffffffff);
39 mdp5_write(mdp5_kms, REG_MDP5_INTR_EN, 0x00000000); 39 mdp5_write(mdp5_kms, REG_MDP5_MDP_INTR_EN(0), 0x00000000);
40 mdp5_disable(mdp5_kms); 40 mdp5_disable(mdp5_kms);
41} 41}
42 42
@@ -61,7 +61,7 @@ void mdp5_irq_uninstall(struct msm_kms *kms)
61{ 61{
62 struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms)); 62 struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms));
63 mdp5_enable(mdp5_kms); 63 mdp5_enable(mdp5_kms);
64 mdp5_write(mdp5_kms, REG_MDP5_INTR_EN, 0x00000000); 64 mdp5_write(mdp5_kms, REG_MDP5_MDP_INTR_EN(0), 0x00000000);
65 mdp5_disable(mdp5_kms); 65 mdp5_disable(mdp5_kms);
66} 66}
67 67
@@ -73,8 +73,8 @@ static void mdp5_irq_mdp(struct mdp_kms *mdp_kms)
73 unsigned int id; 73 unsigned int id;
74 uint32_t status; 74 uint32_t status;
75 75
76 status = mdp5_read(mdp5_kms, REG_MDP5_INTR_STATUS); 76 status = mdp5_read(mdp5_kms, REG_MDP5_MDP_INTR_STATUS(0));
77 mdp5_write(mdp5_kms, REG_MDP5_INTR_CLEAR, status); 77 mdp5_write(mdp5_kms, REG_MDP5_MDP_INTR_CLEAR(0), status);
78 78
79 VERB("status=%08x", status); 79 VERB("status=%08x", status);
80 80
@@ -91,13 +91,13 @@ irqreturn_t mdp5_irq(struct msm_kms *kms)
91 struct mdp5_kms *mdp5_kms = to_mdp5_kms(mdp_kms); 91 struct mdp5_kms *mdp5_kms = to_mdp5_kms(mdp_kms);
92 uint32_t intr; 92 uint32_t intr;
93 93
94 intr = mdp5_read(mdp5_kms, REG_MDP5_HW_INTR_STATUS); 94 intr = mdp5_read(mdp5_kms, REG_MDSS_HW_INTR_STATUS);
95 95
96 VERB("intr=%08x", intr); 96 VERB("intr=%08x", intr);
97 97
98 if (intr & MDP5_HW_INTR_STATUS_INTR_MDP) { 98 if (intr & MDSS_HW_INTR_STATUS_INTR_MDP) {
99 mdp5_irq_mdp(mdp_kms); 99 mdp5_irq_mdp(mdp_kms);
100 intr &= ~MDP5_HW_INTR_STATUS_INTR_MDP; 100 intr &= ~MDSS_HW_INTR_STATUS_INTR_MDP;
101 } 101 }
102 102
103 while (intr) { 103 while (intr) {
@@ -128,10 +128,10 @@ void mdp5_disable_vblank(struct msm_kms *kms, struct drm_crtc *crtc)
128 * can register to get their irq's delivered 128 * can register to get their irq's delivered
129 */ 129 */
130 130
131#define VALID_IRQS (MDP5_HW_INTR_STATUS_INTR_DSI0 | \ 131#define VALID_IRQS (MDSS_HW_INTR_STATUS_INTR_DSI0 | \
132 MDP5_HW_INTR_STATUS_INTR_DSI1 | \ 132 MDSS_HW_INTR_STATUS_INTR_DSI1 | \
133 MDP5_HW_INTR_STATUS_INTR_HDMI | \ 133 MDSS_HW_INTR_STATUS_INTR_HDMI | \
134 MDP5_HW_INTR_STATUS_INTR_EDP) 134 MDSS_HW_INTR_STATUS_INTR_EDP)
135 135
136static void mdp5_hw_mask_irq(struct irq_data *irqd) 136static void mdp5_hw_mask_irq(struct irq_data *irqd)
137{ 137{
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c
index 7e03af56206a..e7ab89dddcf6 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c
@@ -58,7 +58,7 @@ static int mdp5_hw_init(struct msm_kms *kms)
58 */ 58 */
59 59
60 spin_lock_irqsave(&mdp5_kms->resource_lock, flags); 60 spin_lock_irqsave(&mdp5_kms->resource_lock, flags);
61 mdp5_write(mdp5_kms, REG_MDP5_DISP_INTF_SEL, 0); 61 mdp5_write(mdp5_kms, REG_MDP5_MDP_DISP_INTF_SEL(0), 0);
62 spin_unlock_irqrestore(&mdp5_kms->resource_lock, flags); 62 spin_unlock_irqrestore(&mdp5_kms->resource_lock, flags);
63 63
64 mdp5_ctlm_hw_reset(mdp5_kms->ctlm); 64 mdp5_ctlm_hw_reset(mdp5_kms->ctlm);
@@ -296,11 +296,11 @@ static void read_hw_revision(struct mdp5_kms *mdp5_kms,
296 uint32_t version; 296 uint32_t version;
297 297
298 mdp5_enable(mdp5_kms); 298 mdp5_enable(mdp5_kms);
299 version = mdp5_read(mdp5_kms, REG_MDP5_MDP_VERSION); 299 version = mdp5_read(mdp5_kms, REG_MDSS_HW_VERSION);
300 mdp5_disable(mdp5_kms); 300 mdp5_disable(mdp5_kms);
301 301
302 *major = FIELD(version, MDP5_MDP_VERSION_MAJOR); 302 *major = FIELD(version, MDSS_HW_VERSION_MAJOR);
303 *minor = FIELD(version, MDP5_MDP_VERSION_MINOR); 303 *minor = FIELD(version, MDSS_HW_VERSION_MINOR);
304 304
305 DBG("MDP5 version v%d.%d", *major, *minor); 305 DBG("MDP5 version v%d.%d", *major, *minor);
306} 306}
@@ -343,6 +343,7 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
343 343
344 mdp5_kms->dev = dev; 344 mdp5_kms->dev = dev;
345 345
346 /* mdp5_kms->mmio actually represents the MDSS base address */
346 mdp5_kms->mmio = msm_ioremap(pdev, "mdp_phys", "MDP5"); 347 mdp5_kms->mmio = msm_ioremap(pdev, "mdp_phys", "MDP5");
347 if (IS_ERR(mdp5_kms->mmio)) { 348 if (IS_ERR(mdp5_kms->mmio)) {
348 ret = PTR_ERR(mdp5_kms->mmio); 349 ret = PTR_ERR(mdp5_kms->mmio);
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h
index 690edfde4ba1..6efa5c61aa98 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h
@@ -54,7 +54,7 @@ struct mdp5_kms {
54 54
55 /* 55 /*
56 * lock to protect access to global resources: ie., following register: 56 * lock to protect access to global resources: ie., following register:
57 * - REG_MDP5_DISP_INTF_SEL 57 * - REG_MDP5_MDP_DISP_INTF_SEL
58 */ 58 */
59 spinlock_t resource_lock; 59 spinlock_t resource_lock;
60 60
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_smp.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_smp.c
index 1f795af89680..361c064ba44c 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_smp.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_smp.c
@@ -43,7 +43,7 @@
43 * set. 43 * set.
44 * 44 *
45 * 2) mdp5_smp_configure(): 45 * 2) mdp5_smp_configure():
46 * As hw is programmed, before FLUSH, MDP5_SMP_ALLOC registers 46 * As hw is programmed, before FLUSH, MDP5_MDP_SMP_ALLOC registers
47 * are configured for the union(pending, inuse) 47 * are configured for the union(pending, inuse)
48 * 48 *
49 * 3) mdp5_smp_commit(): 49 * 3) mdp5_smp_commit():
@@ -237,25 +237,25 @@ static void update_smp_state(struct mdp5_smp *smp,
237 int idx = blk / 3; 237 int idx = blk / 3;
238 int fld = blk % 3; 238 int fld = blk % 3;
239 239
240 val = mdp5_read(mdp5_kms, REG_MDP5_SMP_ALLOC_W_REG(idx)); 240 val = mdp5_read(mdp5_kms, REG_MDP5_MDP_SMP_ALLOC_W_REG(0, idx));
241 241
242 switch (fld) { 242 switch (fld) {
243 case 0: 243 case 0:
244 val &= ~MDP5_SMP_ALLOC_W_REG_CLIENT0__MASK; 244 val &= ~MDP5_MDP_SMP_ALLOC_W_REG_CLIENT0__MASK;
245 val |= MDP5_SMP_ALLOC_W_REG_CLIENT0(cid); 245 val |= MDP5_MDP_SMP_ALLOC_W_REG_CLIENT0(cid);
246 break; 246 break;
247 case 1: 247 case 1:
248 val &= ~MDP5_SMP_ALLOC_W_REG_CLIENT1__MASK; 248 val &= ~MDP5_MDP_SMP_ALLOC_W_REG_CLIENT1__MASK;
249 val |= MDP5_SMP_ALLOC_W_REG_CLIENT1(cid); 249 val |= MDP5_MDP_SMP_ALLOC_W_REG_CLIENT1(cid);
250 break; 250 break;
251 case 2: 251 case 2:
252 val &= ~MDP5_SMP_ALLOC_W_REG_CLIENT2__MASK; 252 val &= ~MDP5_MDP_SMP_ALLOC_W_REG_CLIENT2__MASK;
253 val |= MDP5_SMP_ALLOC_W_REG_CLIENT2(cid); 253 val |= MDP5_MDP_SMP_ALLOC_W_REG_CLIENT2(cid);
254 break; 254 break;
255 } 255 }
256 256
257 mdp5_write(mdp5_kms, REG_MDP5_SMP_ALLOC_W_REG(idx), val); 257 mdp5_write(mdp5_kms, REG_MDP5_MDP_SMP_ALLOC_W_REG(0, idx), val);
258 mdp5_write(mdp5_kms, REG_MDP5_SMP_ALLOC_R_REG(idx), val); 258 mdp5_write(mdp5_kms, REG_MDP5_MDP_SMP_ALLOC_R_REG(0, idx), val);
259 } 259 }
260} 260}
261 261