diff options
| author | Tomas Winkler <tomas.winkler@intel.com> | 2013-01-08 16:07:31 -0500 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-01-08 19:40:47 -0500 |
| commit | e7e0c231aaa7a01df28634390381974cb76d3cb2 (patch) | |
| tree | e6a2233958265dc3efc649563de50fc4e1605b38 | |
| parent | 88eb99f29c0026f4b7d7702652eb529f04c69073 (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.c | 19 | ||||
| -rw-r--r-- | drivers/misc/mei/init.c | 63 | ||||
| -rw-r--r-- | drivers/misc/mei/interrupt.c | 4 | ||||
| -rw-r--r-- | drivers/misc/mei/mei_dev.h | 4 |
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 | */ |
| 70 | u32 mei_mecsr_read(const struct mei_device *dev) | 70 | static 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 | */ |
| 82 | u32 mei_hcsr_read(const struct mei_device *dev) | 82 | static 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 | */ | ||
| 105 | void 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 | */ |
| 184 | bool mei_host_is_ready(struct mei_device *dev) | 196 | bool 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 | */ |
| 195 | bool mei_me_is_ready(struct mei_device *dev) | 208 | bool 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 | */ |
| 90 | int mei_hw_init(struct mei_device *dev) | 90 | int 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 | ||
| 165 | out: | ||
| 166 | mutex_unlock(&dev->device_lock); | 143 | mutex_unlock(&dev->device_lock); |
| 167 | return ret; | 144 | return 0; |
| 145 | err: | ||
| 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); |
| 747 | end: | 744 | end: |
| 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 | ||
| 388 | void mei_hw_config(struct mei_device *dev); | ||
| 388 | void mei_hw_reset(struct mei_device *dev, bool intr_enable); | 389 | void mei_hw_reset(struct mei_device *dev, bool intr_enable); |
| 389 | u32 mei_hcsr_read(const struct mei_device *dev); | ||
| 390 | u32 mei_mecsr_read(const struct mei_device *dev); | ||
| 391 | u32 mei_mecbrw_read(const struct mei_device *dev); | 390 | u32 mei_mecbrw_read(const struct mei_device *dev); |
| 392 | 391 | ||
| 393 | 392 | ||
| 393 | |||
| 394 | void mei_clear_interrupts(struct mei_device *dev); | 394 | void mei_clear_interrupts(struct mei_device *dev); |
| 395 | void mei_enable_interrupts(struct mei_device *dev); | 395 | void mei_enable_interrupts(struct mei_device *dev); |
| 396 | void mei_disable_interrupts(struct mei_device *dev); | 396 | void mei_disable_interrupts(struct mei_device *dev); |
