aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomas Winkler <tomas.winkler@intel.com>2013-01-08 16:07:31 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-01-08 19:40:47 -0500
commite7e0c231aaa7a01df28634390381974cb76d3cb2 (patch)
treee6a2233958265dc3efc649563de50fc4e1605b38
parent88eb99f29c0026f4b7d7702652eb529f04c69073 (diff)
mei: make host csr and me csr internal to hw-me
Move csr reading into me hardware functional calls. Since we gave up on registers caching we remove some of the unnecessary queries in mei_hw_init ane mei_reset functions. We add mei_hw_config function to wrap up host buffer depth configuration. Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/misc/mei/hw-me.c19
-rw-r--r--drivers/misc/mei/init.c63
-rw-r--r--drivers/misc/mei/interrupt.c4
-rw-r--r--drivers/misc/mei/mei_dev.h4
4 files changed, 37 insertions, 53 deletions
diff --git a/drivers/misc/mei/hw-me.c b/drivers/misc/mei/hw-me.c
index 319002797578..93a2a56a5f2c 100644
--- a/drivers/misc/mei/hw-me.c
+++ b/drivers/misc/mei/hw-me.c
@@ -67,7 +67,7 @@ u32 mei_mecbrw_read(const struct mei_device *dev)
67 * 67 *
68 * returns ME_CSR_HA register value (u32) 68 * returns ME_CSR_HA register value (u32)
69 */ 69 */
70u32 mei_mecsr_read(const struct mei_device *dev) 70static inline u32 mei_mecsr_read(const struct mei_device *dev)
71{ 71{
72 return mei_reg_read(dev, ME_CSR_HA); 72 return mei_reg_read(dev, ME_CSR_HA);
73} 73}
@@ -79,7 +79,7 @@ u32 mei_mecsr_read(const struct mei_device *dev)
79 * 79 *
80 * returns H_CSR register value (u32) 80 * returns H_CSR register value (u32)
81 */ 81 */
82u32 mei_hcsr_read(const struct mei_device *dev) 82static inline u32 mei_hcsr_read(const struct mei_device *dev)
83{ 83{
84 return mei_reg_read(dev, H_CSR); 84 return mei_reg_read(dev, H_CSR);
85} 85}
@@ -96,6 +96,18 @@ static inline void mei_hcsr_set(struct mei_device *dev, u32 hcsr)
96 mei_reg_write(dev, H_CSR, hcsr); 96 mei_reg_write(dev, H_CSR, hcsr);
97} 97}
98 98
99
100/**
101 * me_hw_config - configure hw dependent settings
102 *
103 * @dev: mei device
104 */
105void mei_hw_config(struct mei_device *dev)
106{
107 u32 hcsr = mei_hcsr_read(dev);
108 /* Doesn't change in runtime */
109 dev->hbuf_depth = (hcsr & H_CBD) >> 24;
110}
99/** 111/**
100 * mei_clear_interrupts - clear and stop interrupts 112 * mei_clear_interrupts - clear and stop interrupts
101 * 113 *
@@ -183,6 +195,7 @@ void mei_host_set_ready(struct mei_device *dev)
183 */ 195 */
184bool mei_host_is_ready(struct mei_device *dev) 196bool mei_host_is_ready(struct mei_device *dev)
185{ 197{
198 dev->host_hw_state = mei_hcsr_read(dev);
186 return (dev->host_hw_state & H_RDY) == H_RDY; 199 return (dev->host_hw_state & H_RDY) == H_RDY;
187} 200}
188 201
@@ -194,6 +207,7 @@ bool mei_host_is_ready(struct mei_device *dev)
194 */ 207 */
195bool mei_me_is_ready(struct mei_device *dev) 208bool mei_me_is_ready(struct mei_device *dev)
196{ 209{
210 dev->me_hw_state = mei_mecsr_read(dev);
197 return (dev->me_hw_state & ME_RDY_HRA) == ME_RDY_HRA; 211 return (dev->me_hw_state & ME_RDY_HRA) == ME_RDY_HRA;
198} 212}
199 213
@@ -313,7 +327,6 @@ int mei_write_message(struct mei_device *dev, struct mei_msg_hdr *header,
313 327
314 hcsr = mei_hcsr_read(dev) | H_IG; 328 hcsr = mei_hcsr_read(dev) | H_IG;
315 mei_hcsr_set(dev, hcsr); 329 mei_hcsr_set(dev, hcsr);
316 dev->me_hw_state = mei_mecsr_read(dev);
317 if (!mei_me_is_ready(dev)) 330 if (!mei_me_is_ready(dev))
318 return -EIO; 331 return -EIO;
319 332
diff --git a/drivers/misc/mei/init.c b/drivers/misc/mei/init.c
index d0ee02ac8201..98a7fc18a90a 100644
--- a/drivers/misc/mei/init.c
+++ b/drivers/misc/mei/init.c
@@ -89,82 +89,64 @@ struct mei_device *mei_device_init(struct pci_dev *pdev)
89 */ 89 */
90int mei_hw_init(struct mei_device *dev) 90int mei_hw_init(struct mei_device *dev)
91{ 91{
92 int err = 0; 92 int ret = 0;
93 int ret;
94 93
95 mutex_lock(&dev->device_lock); 94 mutex_lock(&dev->device_lock);
96 95
97 dev->host_hw_state = mei_hcsr_read(dev);
98 dev->me_hw_state = mei_mecsr_read(dev);
99 dev_dbg(&dev->pdev->dev, "host_hw_state = 0x%08x, mestate = 0x%08x.\n",
100 dev->host_hw_state, dev->me_hw_state);
101
102 /* acknowledge interrupt and stop interupts */ 96 /* acknowledge interrupt and stop interupts */
103 mei_clear_interrupts(dev); 97 mei_clear_interrupts(dev);
104 98
105 /* Doesn't change in runtime */ 99 mei_hw_config(dev);
106 dev->hbuf_depth = (dev->host_hw_state & H_CBD) >> 24;
107 100
108 dev->recvd_msg = false; 101 dev->recvd_msg = false;
109 dev_dbg(&dev->pdev->dev, "reset in start the mei device.\n"); 102 dev_dbg(&dev->pdev->dev, "reset in start the mei device.\n");
110 103
111 mei_reset(dev, 1); 104 mei_reset(dev, 1);
112 105
113 dev_dbg(&dev->pdev->dev, "host_hw_state = 0x%08x, me_hw_state = 0x%08x.\n",
114 dev->host_hw_state, dev->me_hw_state);
115
116 /* wait for ME to turn on ME_RDY */ 106 /* wait for ME to turn on ME_RDY */
117 if (!dev->recvd_msg) { 107 if (!dev->recvd_msg) {
118 mutex_unlock(&dev->device_lock); 108 mutex_unlock(&dev->device_lock);
119 err = wait_event_interruptible_timeout(dev->wait_recvd_msg, 109 ret = wait_event_interruptible_timeout(dev->wait_recvd_msg,
120 dev->recvd_msg, 110 dev->recvd_msg,
121 mei_secs_to_jiffies(MEI_INTEROP_TIMEOUT)); 111 mei_secs_to_jiffies(MEI_INTEROP_TIMEOUT));
122 mutex_lock(&dev->device_lock); 112 mutex_lock(&dev->device_lock);
123 } 113 }
124 114
125 if (err <= 0 && !dev->recvd_msg) { 115 if (ret <= 0 && !dev->recvd_msg) {
126 dev->dev_state = MEI_DEV_DISABLED; 116 dev->dev_state = MEI_DEV_DISABLED;
127 dev_dbg(&dev->pdev->dev, 117 dev_dbg(&dev->pdev->dev,
128 "wait_event_interruptible_timeout failed" 118 "wait_event_interruptible_timeout failed"
129 "on wait for ME to turn on ME_RDY.\n"); 119 "on wait for ME to turn on ME_RDY.\n");
130 ret = -ENODEV; 120 goto err;
131 goto out;
132 } 121 }
133 122
134 if (!(mei_host_is_ready(dev) && mei_me_is_ready(dev))) {
135 dev->dev_state = MEI_DEV_DISABLED;
136
137 dev_dbg(&dev->pdev->dev,
138 "host_hw_state = 0x%08x, me_hw_state = 0x%08x.\n",
139 dev->host_hw_state, dev->me_hw_state);
140
141 if (!mei_host_is_ready(dev))
142 dev_dbg(&dev->pdev->dev, "host is not ready.\n");
143 123
144 if (!mei_me_is_ready(dev)) 124 if (!mei_host_is_ready(dev)) {
145 dev_dbg(&dev->pdev->dev, "ME is not ready.\n"); 125 dev_err(&dev->pdev->dev, "host is not ready.\n");
126 goto err;
127 }
146 128
147 dev_err(&dev->pdev->dev, "link layer initialization failed.\n"); 129 if (!mei_me_is_ready(dev)) {
148 ret = -ENODEV; 130 dev_err(&dev->pdev->dev, "ME is not ready.\n");
149 goto out; 131 goto err;
150 } 132 }
151 133
152 if (dev->version.major_version != HBM_MAJOR_VERSION || 134 if (dev->version.major_version != HBM_MAJOR_VERSION ||
153 dev->version.minor_version != HBM_MINOR_VERSION) { 135 dev->version.minor_version != HBM_MINOR_VERSION) {
154 dev_dbg(&dev->pdev->dev, "MEI start failed.\n"); 136 dev_dbg(&dev->pdev->dev, "MEI start failed.\n");
155 ret = -ENODEV; 137 goto err;
156 goto out;
157 } 138 }
158 139
159 dev->recvd_msg = false; 140 dev->recvd_msg = false;
160 dev_dbg(&dev->pdev->dev, "host_hw_state = 0x%08x, me_hw_state = 0x%08x.\n",
161 dev->host_hw_state, dev->me_hw_state);
162 dev_dbg(&dev->pdev->dev, "link layer has been established.\n"); 141 dev_dbg(&dev->pdev->dev, "link layer has been established.\n");
163 ret = 0;
164 142
165out:
166 mutex_unlock(&dev->device_lock); 143 mutex_unlock(&dev->device_lock);
167 return ret; 144 return 0;
145err:
146 dev_err(&dev->pdev->dev, "link layer initialization failed.\n");
147 dev->dev_state = MEI_DEV_DISABLED;
148 mutex_unlock(&dev->device_lock);
149 return -ENODEV;
168} 150}
169 151
170/** 152/**
@@ -221,13 +203,6 @@ void mei_reset(struct mei_device *dev, int interrupts_enabled)
221 dev->rd_msg_hdr = 0; 203 dev->rd_msg_hdr = 0;
222 dev->wd_pending = false; 204 dev->wd_pending = false;
223 205
224 /* update the state of the registers after reset */
225 dev->host_hw_state = mei_hcsr_read(dev);
226 dev->me_hw_state = mei_mecsr_read(dev);
227
228 dev_dbg(&dev->pdev->dev, "after reset host_hw_state = 0x%08x, me_hw_state = 0x%08x.\n",
229 dev->host_hw_state, dev->me_hw_state);
230
231 if (unexpected) 206 if (unexpected)
232 dev_warn(&dev->pdev->dev, "unexpected reset: dev_state = %s\n", 207 dev_warn(&dev->pdev->dev, "unexpected reset: dev_state = %s\n",
233 mei_dev_state_str(dev->dev_state)); 208 mei_dev_state_str(dev->dev_state));
diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c
index 27374b6b6424..b04ed9bdf758 100644
--- a/drivers/misc/mei/interrupt.c
+++ b/drivers/misc/mei/interrupt.c
@@ -697,8 +697,6 @@ irqreturn_t mei_interrupt_thread_handler(int irq, void *dev_id)
697 if (pci_dev_msi_enabled(dev->pdev)) 697 if (pci_dev_msi_enabled(dev->pdev))
698 mei_clear_interrupts(dev); 698 mei_clear_interrupts(dev);
699 699
700 dev->me_hw_state = mei_mecsr_read(dev);
701
702 /* check if ME wants a reset */ 700 /* check if ME wants a reset */
703 if (!mei_me_is_ready(dev) && 701 if (!mei_me_is_ready(dev) &&
704 dev->dev_state != MEI_DEV_RESETING && 702 dev->dev_state != MEI_DEV_RESETING &&
@@ -709,7 +707,6 @@ irqreturn_t mei_interrupt_thread_handler(int irq, void *dev_id)
709 return IRQ_HANDLED; 707 return IRQ_HANDLED;
710 } 708 }
711 709
712 dev->host_hw_state = mei_hcsr_read(dev);
713 /* check if we need to start the dev */ 710 /* check if we need to start the dev */
714 if (!mei_host_is_ready(dev)) { 711 if (!mei_host_is_ready(dev)) {
715 if (mei_me_is_ready(dev)) { 712 if (mei_me_is_ready(dev)) {
@@ -746,7 +743,6 @@ irqreturn_t mei_interrupt_thread_handler(int irq, void *dev_id)
746 rets = mei_irq_thread_write_handler(dev, &complete_list); 743 rets = mei_irq_thread_write_handler(dev, &complete_list);
747end: 744end:
748 dev_dbg(&dev->pdev->dev, "end of bottom half function.\n"); 745 dev_dbg(&dev->pdev->dev, "end of bottom half function.\n");
749 dev->host_hw_state = mei_hcsr_read(dev);
750 dev->mei_host_buffer_is_empty = mei_hbuf_is_empty(dev); 746 dev->mei_host_buffer_is_empty = mei_hbuf_is_empty(dev);
751 747
752 bus_message_received = false; 748 bus_message_received = false;
diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h
index ae4c5ffc712b..d6589d0d305a 100644
--- a/drivers/misc/mei/mei_dev.h
+++ b/drivers/misc/mei/mei_dev.h
@@ -385,12 +385,12 @@ void mei_watchdog_unregister(struct mei_device *dev);
385 * Register Access Function 385 * Register Access Function
386 */ 386 */
387 387
388void mei_hw_config(struct mei_device *dev);
388void mei_hw_reset(struct mei_device *dev, bool intr_enable); 389void mei_hw_reset(struct mei_device *dev, bool intr_enable);
389u32 mei_hcsr_read(const struct mei_device *dev);
390u32 mei_mecsr_read(const struct mei_device *dev);
391u32 mei_mecbrw_read(const struct mei_device *dev); 390u32 mei_mecbrw_read(const struct mei_device *dev);
392 391
393 392
393
394void mei_clear_interrupts(struct mei_device *dev); 394void mei_clear_interrupts(struct mei_device *dev);
395void mei_enable_interrupts(struct mei_device *dev); 395void mei_enable_interrupts(struct mei_device *dev);
396void mei_disable_interrupts(struct mei_device *dev); 396void mei_disable_interrupts(struct mei_device *dev);