Skip to content

Commit

Permalink
mei: make host csr and me csr internal to hw-me
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Tomas Winkler authored and Greg Kroah-Hartman committed Jan 9, 2013
1 parent 88eb99f commit e7e0c23
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 53 deletions.
19 changes: 16 additions & 3 deletions drivers/misc/mei/hw-me.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ u32 mei_mecbrw_read(const struct mei_device *dev)
*
* returns ME_CSR_HA register value (u32)
*/
u32 mei_mecsr_read(const struct mei_device *dev)
static inline u32 mei_mecsr_read(const struct mei_device *dev)
{
return mei_reg_read(dev, ME_CSR_HA);
}
Expand All @@ -79,7 +79,7 @@ u32 mei_mecsr_read(const struct mei_device *dev)
*
* returns H_CSR register value (u32)
*/
u32 mei_hcsr_read(const struct mei_device *dev)
static inline u32 mei_hcsr_read(const struct mei_device *dev)
{
return mei_reg_read(dev, H_CSR);
}
Expand All @@ -96,6 +96,18 @@ static inline void mei_hcsr_set(struct mei_device *dev, u32 hcsr)
mei_reg_write(dev, H_CSR, hcsr);
}


/**
* me_hw_config - configure hw dependent settings
*
* @dev: mei device
*/
void mei_hw_config(struct mei_device *dev)
{
u32 hcsr = mei_hcsr_read(dev);
/* Doesn't change in runtime */
dev->hbuf_depth = (hcsr & H_CBD) >> 24;
}
/**
* mei_clear_interrupts - clear and stop interrupts
*
Expand Down Expand Up @@ -183,6 +195,7 @@ void mei_host_set_ready(struct mei_device *dev)
*/
bool mei_host_is_ready(struct mei_device *dev)
{
dev->host_hw_state = mei_hcsr_read(dev);
return (dev->host_hw_state & H_RDY) == H_RDY;
}

Expand All @@ -194,6 +207,7 @@ bool mei_host_is_ready(struct mei_device *dev)
*/
bool mei_me_is_ready(struct mei_device *dev)
{
dev->me_hw_state = mei_mecsr_read(dev);
return (dev->me_hw_state & ME_RDY_HRA) == ME_RDY_HRA;
}

Expand Down Expand Up @@ -313,7 +327,6 @@ int mei_write_message(struct mei_device *dev, struct mei_msg_hdr *header,

hcsr = mei_hcsr_read(dev) | H_IG;
mei_hcsr_set(dev, hcsr);
dev->me_hw_state = mei_mecsr_read(dev);
if (!mei_me_is_ready(dev))
return -EIO;

Expand Down
63 changes: 19 additions & 44 deletions drivers/misc/mei/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,82 +89,64 @@ struct mei_device *mei_device_init(struct pci_dev *pdev)
*/
int mei_hw_init(struct mei_device *dev)
{
int err = 0;
int ret;
int ret = 0;

mutex_lock(&dev->device_lock);

dev->host_hw_state = mei_hcsr_read(dev);
dev->me_hw_state = mei_mecsr_read(dev);
dev_dbg(&dev->pdev->dev, "host_hw_state = 0x%08x, mestate = 0x%08x.\n",
dev->host_hw_state, dev->me_hw_state);

/* acknowledge interrupt and stop interupts */
mei_clear_interrupts(dev);

/* Doesn't change in runtime */
dev->hbuf_depth = (dev->host_hw_state & H_CBD) >> 24;
mei_hw_config(dev);

dev->recvd_msg = false;
dev_dbg(&dev->pdev->dev, "reset in start the mei device.\n");

mei_reset(dev, 1);

dev_dbg(&dev->pdev->dev, "host_hw_state = 0x%08x, me_hw_state = 0x%08x.\n",
dev->host_hw_state, dev->me_hw_state);

/* wait for ME to turn on ME_RDY */
if (!dev->recvd_msg) {
mutex_unlock(&dev->device_lock);
err = wait_event_interruptible_timeout(dev->wait_recvd_msg,
ret = wait_event_interruptible_timeout(dev->wait_recvd_msg,
dev->recvd_msg,
mei_secs_to_jiffies(MEI_INTEROP_TIMEOUT));
mutex_lock(&dev->device_lock);
}

if (err <= 0 && !dev->recvd_msg) {
if (ret <= 0 && !dev->recvd_msg) {
dev->dev_state = MEI_DEV_DISABLED;
dev_dbg(&dev->pdev->dev,
"wait_event_interruptible_timeout failed"
"on wait for ME to turn on ME_RDY.\n");
ret = -ENODEV;
goto out;
goto err;
}

if (!(mei_host_is_ready(dev) && mei_me_is_ready(dev))) {
dev->dev_state = MEI_DEV_DISABLED;

dev_dbg(&dev->pdev->dev,
"host_hw_state = 0x%08x, me_hw_state = 0x%08x.\n",
dev->host_hw_state, dev->me_hw_state);

if (!mei_host_is_ready(dev))
dev_dbg(&dev->pdev->dev, "host is not ready.\n");

if (!mei_me_is_ready(dev))
dev_dbg(&dev->pdev->dev, "ME is not ready.\n");
if (!mei_host_is_ready(dev)) {
dev_err(&dev->pdev->dev, "host is not ready.\n");
goto err;
}

dev_err(&dev->pdev->dev, "link layer initialization failed.\n");
ret = -ENODEV;
goto out;
if (!mei_me_is_ready(dev)) {
dev_err(&dev->pdev->dev, "ME is not ready.\n");
goto err;
}

if (dev->version.major_version != HBM_MAJOR_VERSION ||
dev->version.minor_version != HBM_MINOR_VERSION) {
dev_dbg(&dev->pdev->dev, "MEI start failed.\n");
ret = -ENODEV;
goto out;
goto err;
}

dev->recvd_msg = false;
dev_dbg(&dev->pdev->dev, "host_hw_state = 0x%08x, me_hw_state = 0x%08x.\n",
dev->host_hw_state, dev->me_hw_state);
dev_dbg(&dev->pdev->dev, "link layer has been established.\n");
ret = 0;

out:
mutex_unlock(&dev->device_lock);
return ret;
return 0;
err:
dev_err(&dev->pdev->dev, "link layer initialization failed.\n");
dev->dev_state = MEI_DEV_DISABLED;
mutex_unlock(&dev->device_lock);
return -ENODEV;
}

/**
Expand Down Expand Up @@ -221,13 +203,6 @@ void mei_reset(struct mei_device *dev, int interrupts_enabled)
dev->rd_msg_hdr = 0;
dev->wd_pending = false;

/* update the state of the registers after reset */
dev->host_hw_state = mei_hcsr_read(dev);
dev->me_hw_state = mei_mecsr_read(dev);

dev_dbg(&dev->pdev->dev, "after reset host_hw_state = 0x%08x, me_hw_state = 0x%08x.\n",
dev->host_hw_state, dev->me_hw_state);

if (unexpected)
dev_warn(&dev->pdev->dev, "unexpected reset: dev_state = %s\n",
mei_dev_state_str(dev->dev_state));
Expand Down
4 changes: 0 additions & 4 deletions drivers/misc/mei/interrupt.c
Original file line number Diff line number Diff line change
Expand Up @@ -697,8 +697,6 @@ irqreturn_t mei_interrupt_thread_handler(int irq, void *dev_id)
if (pci_dev_msi_enabled(dev->pdev))
mei_clear_interrupts(dev);

dev->me_hw_state = mei_mecsr_read(dev);

/* check if ME wants a reset */
if (!mei_me_is_ready(dev) &&
dev->dev_state != MEI_DEV_RESETING &&
Expand All @@ -709,7 +707,6 @@ irqreturn_t mei_interrupt_thread_handler(int irq, void *dev_id)
return IRQ_HANDLED;
}

dev->host_hw_state = mei_hcsr_read(dev);
/* check if we need to start the dev */
if (!mei_host_is_ready(dev)) {
if (mei_me_is_ready(dev)) {
Expand Down Expand Up @@ -746,7 +743,6 @@ irqreturn_t mei_interrupt_thread_handler(int irq, void *dev_id)
rets = mei_irq_thread_write_handler(dev, &complete_list);
end:
dev_dbg(&dev->pdev->dev, "end of bottom half function.\n");
dev->host_hw_state = mei_hcsr_read(dev);
dev->mei_host_buffer_is_empty = mei_hbuf_is_empty(dev);

bus_message_received = false;
Expand Down
4 changes: 2 additions & 2 deletions drivers/misc/mei/mei_dev.h
Original file line number Diff line number Diff line change
Expand Up @@ -385,12 +385,12 @@ void mei_watchdog_unregister(struct mei_device *dev);
* Register Access Function
*/

void mei_hw_config(struct mei_device *dev);
void mei_hw_reset(struct mei_device *dev, bool intr_enable);
u32 mei_hcsr_read(const struct mei_device *dev);
u32 mei_mecsr_read(const struct mei_device *dev);
u32 mei_mecbrw_read(const struct mei_device *dev);



void mei_clear_interrupts(struct mei_device *dev);
void mei_enable_interrupts(struct mei_device *dev);
void mei_disable_interrupts(struct mei_device *dev);
Expand Down

0 comments on commit e7e0c23

Please sign in to comment.