hw-me.c 21.1 KB
Newer Older
O
Oren Weil 已提交
1 2 3
/*
 *
 * Intel Management Engine Interface (Intel MEI) Linux driver
4
 * Copyright (c) 2003-2012, Intel Corporation.
O
Oren Weil 已提交
5 6 7 8 9 10 11 12 13 14 15 16 17
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 */

#include <linux/pci.h>
18 19 20

#include <linux/kthread.h>
#include <linux/interrupt.h>
21 22

#include "mei_dev.h"
23 24
#include "hbm.h"

25 26
#include "hw-me.h"
#include "hw-me-regs.h"
27

T
Tomas Winkler 已提交
28 29
#include "mei-trace.h"

30
/**
31
 * mei_me_reg_read - Reads 32bit data from the mei device
32
 *
33
 * @hw: the me hardware structure
34 35
 * @offset: offset from which to read the data
 *
36
 * Return: register value (u32)
37
 */
38
static inline u32 mei_me_reg_read(const struct mei_me_hw *hw,
39 40
			       unsigned long offset)
{
41
	return ioread32(hw->mem_addr + offset);
42 43 44 45
}


/**
46
 * mei_me_reg_write - Writes 32bit data to the mei device
47
 *
48
 * @hw: the me hardware structure
49 50 51
 * @offset: offset from which to write the data
 * @value: register value to write (u32)
 */
52
static inline void mei_me_reg_write(const struct mei_me_hw *hw,
53 54
				 unsigned long offset, u32 value)
{
55
	iowrite32(value, hw->mem_addr + offset);
56
}
O
Oren Weil 已提交
57

58
/**
59
 * mei_me_mecbrw_read - Reads 32bit data from ME circular buffer
T
Tomas Winkler 已提交
60
 *  read window register
61 62 63
 *
 * @dev: the device structure
 *
64
 * Return: ME_CB_RW register value (u32)
65
 */
66
static inline u32 mei_me_mecbrw_read(const struct mei_device *dev)
67
{
68
	return mei_me_reg_read(to_me_hw(dev), ME_CB_RW);
69
}
70 71 72 73 74 75 76 77 78 79 80 81

/**
 * mei_me_hcbww_write - write 32bit data to the host circular buffer
 *
 * @dev: the device structure
 * @data: 32bit data to be written to the host circular buffer
 */
static inline void mei_me_hcbww_write(struct mei_device *dev, u32 data)
{
	mei_me_reg_write(to_me_hw(dev), H_CB_WW, data);
}

82
/**
83
 * mei_me_mecsr_read - Reads 32bit data from the ME CSR
84
 *
85
 * @dev: the device structure
86
 *
87
 * Return: ME_CSR_HA register value (u32)
88
 */
89
static inline u32 mei_me_mecsr_read(const struct mei_device *dev)
90
{
T
Tomas Winkler 已提交
91 92 93 94 95 96
	u32 reg;

	reg = mei_me_reg_read(to_me_hw(dev), ME_CSR_HA);
	trace_mei_reg_read(dev->dev, "ME_CSR_HA", ME_CSR_HA, reg);

	return reg;
97
}
O
Oren Weil 已提交
98 99

/**
T
Tomas Winkler 已提交
100 101
 * mei_hcsr_read - Reads 32bit data from the host CSR
 *
102
 * @dev: the device structure
T
Tomas Winkler 已提交
103
 *
104
 * Return: H_CSR register value (u32)
T
Tomas Winkler 已提交
105
 */
106
static inline u32 mei_hcsr_read(const struct mei_device *dev)
T
Tomas Winkler 已提交
107
{
T
Tomas Winkler 已提交
108 109 110 111 112 113
	u32 reg;

	reg = mei_me_reg_read(to_me_hw(dev), H_CSR);
	trace_mei_reg_read(dev->dev, "H_CSR", H_CSR, reg);

	return reg;
114 115 116 117 118 119 120 121 122 123
}

/**
 * mei_hcsr_write - writes H_CSR register to the mei device
 *
 * @dev: the device structure
 * @reg: new register value
 */
static inline void mei_hcsr_write(struct mei_device *dev, u32 reg)
{
T
Tomas Winkler 已提交
124
	trace_mei_reg_write(dev->dev, "H_CSR", H_CSR, reg);
125
	mei_me_reg_write(to_me_hw(dev), H_CSR, reg);
T
Tomas Winkler 已提交
126 127 128 129
}

/**
 * mei_hcsr_set - writes H_CSR register to the mei device,
O
Oren Weil 已提交
130 131
 * and ignores the H_IS bit for it is write-one-to-zero.
 *
132 133
 * @dev: the device structure
 * @reg: new register value
O
Oren Weil 已提交
134
 */
135
static inline void mei_hcsr_set(struct mei_device *dev, u32 reg)
O
Oren Weil 已提交
136
{
137 138
	reg &= ~H_IS;
	mei_hcsr_write(dev, reg);
O
Oren Weil 已提交
139 140
}

141 142 143 144 145
/**
 * mei_me_fw_status - read fw status register from pci config space
 *
 * @dev: mei device
 * @fw_status: fw status register values
A
Alexander Usyskin 已提交
146 147
 *
 * Return: 0 on success, error otherwise
148 149 150 151 152
 */
static int mei_me_fw_status(struct mei_device *dev,
			    struct mei_fw_status *fw_status)
{
	struct pci_dev *pdev = to_pci_dev(dev->dev);
153 154
	struct mei_me_hw *hw = to_me_hw(dev);
	const struct mei_fw_status *fw_src = &hw->cfg->fw_status;
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
	int ret;
	int i;

	if (!fw_status)
		return -EINVAL;

	fw_status->count = fw_src->count;
	for (i = 0; i < fw_src->count && i < MEI_FW_STATUS_MAX; i++) {
		ret = pci_read_config_dword(pdev,
			fw_src->status[i], &fw_status->status[i]);
		if (ret)
			return ret;
	}

	return 0;
}
171 172

/**
173
 * mei_me_hw_config - configure hw dependent settings
174 175 176
 *
 * @dev: mei device
 */
177
static void mei_me_hw_config(struct mei_device *dev)
178
{
179
	struct mei_me_hw *hw = to_me_hw(dev);
180
	u32 hcsr = mei_hcsr_read(dev);
181 182
	/* Doesn't change in runtime */
	dev->hbuf_depth = (hcsr & H_CBD) >> 24;
183 184

	hw->pg_state = MEI_PG_OFF;
185
}
186 187 188 189 190

/**
 * mei_me_pg_state  - translate internal pg state
 *   to the mei power gating state
 *
A
Alexander Usyskin 已提交
191 192 193
 * @dev:  mei device
 *
 * Return: MEI_PG_OFF if aliveness is on and MEI_PG_ON otherwise
194 195 196
 */
static inline enum mei_pg_state mei_me_pg_state(struct mei_device *dev)
{
197
	struct mei_me_hw *hw = to_me_hw(dev);
198

199
	return hw->pg_state;
200 201
}

O
Oren Weil 已提交
202
/**
A
Alexander Usyskin 已提交
203
 * mei_me_intr_clear - clear and stop interrupts
204 205 206
 *
 * @dev: the device structure
 */
207
static void mei_me_intr_clear(struct mei_device *dev)
208
{
209
	u32 hcsr = mei_hcsr_read(dev);
210

211
	if ((hcsr & H_IS) == H_IS)
212
		mei_hcsr_write(dev, hcsr);
213 214
}
/**
215
 * mei_me_intr_enable - enables mei device interrupts
O
Oren Weil 已提交
216 217 218
 *
 * @dev: the device structure
 */
219
static void mei_me_intr_enable(struct mei_device *dev)
O
Oren Weil 已提交
220
{
221
	u32 hcsr = mei_hcsr_read(dev);
222

223
	hcsr |= H_IE;
224
	mei_hcsr_set(dev, hcsr);
O
Oren Weil 已提交
225 226 227
}

/**
A
Alexander Usyskin 已提交
228
 * mei_me_intr_disable - disables mei device interrupts
O
Oren Weil 已提交
229 230 231
 *
 * @dev: the device structure
 */
232
static void mei_me_intr_disable(struct mei_device *dev)
O
Oren Weil 已提交
233
{
234
	u32 hcsr = mei_hcsr_read(dev);
235

236
	hcsr  &= ~H_IE;
237
	mei_hcsr_set(dev, hcsr);
O
Oren Weil 已提交
238 239
}

240 241 242 243 244 245 246
/**
 * mei_me_hw_reset_release - release device from the reset
 *
 * @dev: the device structure
 */
static void mei_me_hw_reset_release(struct mei_device *dev)
{
247
	u32 hcsr = mei_hcsr_read(dev);
248 249 250

	hcsr |= H_IG;
	hcsr &= ~H_RST;
251
	mei_hcsr_set(dev, hcsr);
T
Tomas Winkler 已提交
252 253 254

	/* complete this write before we set host ready on another CPU */
	mmiowb();
255
}
256
/**
257
 * mei_me_hw_reset - resets fw via mei csr register.
258 259
 *
 * @dev: the device structure
260
 * @intr_enable: if interrupt should be enabled after reset.
A
Alexander Usyskin 已提交
261 262
 *
 * Return: always 0
263
 */
264
static int mei_me_hw_reset(struct mei_device *dev, bool intr_enable)
265
{
266
	u32 hcsr = mei_hcsr_read(dev);
267

268 269 270 271 272 273 274 275
	/* H_RST may be found lit before reset is started,
	 * for example if preceding reset flow hasn't completed.
	 * In that case asserting H_RST will be ignored, therefore
	 * we need to clean H_RST bit to start a successful reset sequence.
	 */
	if ((hcsr & H_RST) == H_RST) {
		dev_warn(dev->dev, "H_RST is set = 0x%08X", hcsr);
		hcsr &= ~H_RST;
276 277
		mei_hcsr_set(dev, hcsr);
		hcsr = mei_hcsr_read(dev);
278 279
	}

T
Tomas Winkler 已提交
280
	hcsr |= H_RST | H_IG | H_IS;
281 282 283 284

	if (intr_enable)
		hcsr |= H_IE;
	else
T
Tomas Winkler 已提交
285
		hcsr &= ~H_IE;
286

287
	dev->recvd_hw_ready = false;
288
	mei_hcsr_write(dev, hcsr);
289

290 291 292 293
	/*
	 * Host reads the H_CSR once to ensure that the
	 * posted write to H_CSR completes.
	 */
294
	hcsr = mei_hcsr_read(dev);
295 296

	if ((hcsr & H_RST) == 0)
297
		dev_warn(dev->dev, "H_RST is not set = 0x%08X", hcsr);
298 299

	if ((hcsr & H_RDY) == H_RDY)
300
		dev_warn(dev->dev, "H_RDY is not cleared 0x%08X", hcsr);
301

302
	if (intr_enable == false)
303
		mei_me_hw_reset_release(dev);
304

305
	return 0;
306 307
}

308
/**
309
 * mei_me_host_set_ready - enable device
310
 *
A
Alexander Usyskin 已提交
311
 * @dev: mei device
312
 */
313
static void mei_me_host_set_ready(struct mei_device *dev)
314
{
315
	u32 hcsr = mei_hcsr_read(dev);
316

317
	hcsr |= H_IE | H_IG | H_RDY;
318
	mei_hcsr_set(dev, hcsr);
319
}
A
Alexander Usyskin 已提交
320

321
/**
322
 * mei_me_host_is_ready - check whether the host has turned ready
323
 *
324 325
 * @dev: mei device
 * Return: bool
326
 */
327
static bool mei_me_host_is_ready(struct mei_device *dev)
328
{
329
	u32 hcsr = mei_hcsr_read(dev);
330

331
	return (hcsr & H_RDY) == H_RDY;
332 333 334
}

/**
335
 * mei_me_hw_is_ready - check whether the me(hw) has turned ready
336
 *
337 338
 * @dev: mei device
 * Return: bool
339
 */
340
static bool mei_me_hw_is_ready(struct mei_device *dev)
341
{
342
	u32 mecsr = mei_me_mecsr_read(dev);
343

344
	return (mecsr & ME_RDY_HRA) == ME_RDY_HRA;
345
}
346

A
Alexander Usyskin 已提交
347 348 349 350 351 352 353
/**
 * mei_me_hw_ready_wait - wait until the me(hw) has turned ready
 *  or timeout is reached
 *
 * @dev: mei device
 * Return: 0 on success, error otherwise
 */
T
Tomas Winkler 已提交
354 355 356
static int mei_me_hw_ready_wait(struct mei_device *dev)
{
	mutex_unlock(&dev->device_lock);
357
	wait_event_timeout(dev->wait_hw_ready,
358
			dev->recvd_hw_ready,
359
			mei_secs_to_jiffies(MEI_HW_READY_TIMEOUT));
T
Tomas Winkler 已提交
360
	mutex_lock(&dev->device_lock);
361
	if (!dev->recvd_hw_ready) {
362
		dev_err(dev->dev, "wait hw ready failed\n");
363
		return -ETIME;
T
Tomas Winkler 已提交
364 365
	}

366
	mei_me_hw_reset_release(dev);
T
Tomas Winkler 已提交
367 368 369 370
	dev->recvd_hw_ready = false;
	return 0;
}

A
Alexander Usyskin 已提交
371 372 373 374 375 376
/**
 * mei_me_hw_start - hw start routine
 *
 * @dev: mei device
 * Return: 0 on success, error otherwise
 */
T
Tomas Winkler 已提交
377 378 379
static int mei_me_hw_start(struct mei_device *dev)
{
	int ret = mei_me_hw_ready_wait(dev);
380

T
Tomas Winkler 已提交
381 382
	if (ret)
		return ret;
383
	dev_dbg(dev->dev, "hw is ready\n");
T
Tomas Winkler 已提交
384 385 386 387 388 389

	mei_me_host_set_ready(dev);
	return ret;
}


O
Oren Weil 已提交
390
/**
391
 * mei_hbuf_filled_slots - gets number of device filled buffer slots
O
Oren Weil 已提交
392
 *
393
 * @dev: the device structure
O
Oren Weil 已提交
394
 *
395
 * Return: number of filled slots
O
Oren Weil 已提交
396
 */
397
static unsigned char mei_hbuf_filled_slots(struct mei_device *dev)
O
Oren Weil 已提交
398
{
399
	u32 hcsr;
O
Oren Weil 已提交
400 401
	char read_ptr, write_ptr;

402
	hcsr = mei_hcsr_read(dev);
403

404 405
	read_ptr = (char) ((hcsr & H_CBRP) >> 8);
	write_ptr = (char) ((hcsr & H_CBWP) >> 16);
O
Oren Weil 已提交
406 407 408 409 410

	return (unsigned char) (write_ptr - read_ptr);
}

/**
411
 * mei_me_hbuf_is_empty - checks if host buffer is empty.
O
Oren Weil 已提交
412 413 414
 *
 * @dev: the device structure
 *
415
 * Return: true if empty, false - otherwise.
O
Oren Weil 已提交
416
 */
417
static bool mei_me_hbuf_is_empty(struct mei_device *dev)
O
Oren Weil 已提交
418
{
419
	return mei_hbuf_filled_slots(dev) == 0;
O
Oren Weil 已提交
420 421 422
}

/**
423
 * mei_me_hbuf_empty_slots - counts write empty slots.
O
Oren Weil 已提交
424 425 426
 *
 * @dev: the device structure
 *
427
 * Return: -EOVERFLOW if overflow, otherwise empty slots count
O
Oren Weil 已提交
428
 */
429
static int mei_me_hbuf_empty_slots(struct mei_device *dev)
O
Oren Weil 已提交
430
{
431
	unsigned char filled_slots, empty_slots;
O
Oren Weil 已提交
432

433
	filled_slots = mei_hbuf_filled_slots(dev);
434
	empty_slots = dev->hbuf_depth - filled_slots;
O
Oren Weil 已提交
435 436

	/* check for overflow */
437
	if (filled_slots > dev->hbuf_depth)
O
Oren Weil 已提交
438 439 440 441 442
		return -EOVERFLOW;

	return empty_slots;
}

A
Alexander Usyskin 已提交
443 444 445 446 447 448 449
/**
 * mei_me_hbuf_max_len - returns size of hw buffer.
 *
 * @dev: the device structure
 *
 * Return: size of hw buffer in bytes
 */
450 451 452 453 454 455
static size_t mei_me_hbuf_max_len(const struct mei_device *dev)
{
	return dev->hbuf_depth * sizeof(u32) - sizeof(struct mei_msg_hdr);
}


O
Oren Weil 已提交
456
/**
457
 * mei_me_write_message - writes a message to mei device.
O
Oren Weil 已提交
458 459
 *
 * @dev: the device structure
460
 * @header: mei HECI header of message
461
 * @buf: message payload will be written
O
Oren Weil 已提交
462
 *
463
 * Return: -EIO if write has failed
O
Oren Weil 已提交
464
 */
465 466 467
static int mei_me_write_message(struct mei_device *dev,
			struct mei_msg_hdr *header,
			unsigned char *buf)
O
Oren Weil 已提交
468
{
T
Tomas Winkler 已提交
469
	unsigned long rem;
470
	unsigned long length = header->length;
471
	u32 *reg_buf = (u32 *)buf;
472
	u32 hcsr;
T
Tomas Winkler 已提交
473
	u32 dw_cnt;
474 475
	int i;
	int empty_slots;
O
Oren Weil 已提交
476

477
	dev_dbg(dev->dev, MEI_HDR_FMT, MEI_HDR_PRM(header));
O
Oren Weil 已提交
478

479
	empty_slots = mei_hbuf_empty_slots(dev);
480
	dev_dbg(dev->dev, "empty slots = %hu.\n", empty_slots);
O
Oren Weil 已提交
481

482
	dw_cnt = mei_data2slots(length);
483
	if (empty_slots < 0 || dw_cnt > empty_slots)
484
		return -EMSGSIZE;
O
Oren Weil 已提交
485

486
	mei_me_hcbww_write(dev, *((u32 *) header));
O
Oren Weil 已提交
487

488
	for (i = 0; i < length / 4; i++)
489
		mei_me_hcbww_write(dev, reg_buf[i]);
O
Oren Weil 已提交
490

491 492 493
	rem = length & 0x3;
	if (rem > 0) {
		u32 reg = 0;
494

495
		memcpy(&reg, &buf[length - rem], rem);
496
		mei_me_hcbww_write(dev, reg);
O
Oren Weil 已提交
497 498
	}

499 500
	hcsr = mei_hcsr_read(dev) | H_IG;
	mei_hcsr_set(dev, hcsr);
501
	if (!mei_me_hw_is_ready(dev))
502
		return -EIO;
O
Oren Weil 已提交
503

504
	return 0;
O
Oren Weil 已提交
505 506 507
}

/**
508
 * mei_me_count_full_read_slots - counts read full slots.
O
Oren Weil 已提交
509 510 511
 *
 * @dev: the device structure
 *
512
 * Return: -EOVERFLOW if overflow, otherwise filled slots count
O
Oren Weil 已提交
513
 */
514
static int mei_me_count_full_read_slots(struct mei_device *dev)
O
Oren Weil 已提交
515
{
516
	u32 me_csr;
O
Oren Weil 已提交
517 518 519
	char read_ptr, write_ptr;
	unsigned char buffer_depth, filled_slots;

520
	me_csr = mei_me_mecsr_read(dev);
521 522 523
	buffer_depth = (unsigned char)((me_csr & ME_CBD_HRA) >> 24);
	read_ptr = (char) ((me_csr & ME_CBRP_HRA) >> 8);
	write_ptr = (char) ((me_csr & ME_CBWP_HRA) >> 16);
O
Oren Weil 已提交
524 525 526 527 528 529
	filled_slots = (unsigned char) (write_ptr - read_ptr);

	/* check for overflow */
	if (filled_slots > buffer_depth)
		return -EOVERFLOW;

530
	dev_dbg(dev->dev, "filled_slots =%08x\n", filled_slots);
O
Oren Weil 已提交
531 532 533 534
	return (int)filled_slots;
}

/**
535
 * mei_me_read_slots - reads a message from mei device.
O
Oren Weil 已提交
536 537 538 539
 *
 * @dev: the device structure
 * @buffer: message buffer will be written
 * @buffer_length: message size will be read
A
Alexander Usyskin 已提交
540 541
 *
 * Return: always 0
O
Oren Weil 已提交
542
 */
543
static int mei_me_read_slots(struct mei_device *dev, unsigned char *buffer,
544
		    unsigned long buffer_length)
O
Oren Weil 已提交
545
{
546
	u32 *reg_buf = (u32 *)buffer;
547
	u32 hcsr;
O
Oren Weil 已提交
548

549
	for (; buffer_length >= sizeof(u32); buffer_length -= sizeof(u32))
550
		*reg_buf++ = mei_me_mecbrw_read(dev);
O
Oren Weil 已提交
551 552

	if (buffer_length > 0) {
553
		u32 reg = mei_me_mecbrw_read(dev);
554

555
		memcpy(reg_buf, &reg, buffer_length);
O
Oren Weil 已提交
556 557
	}

558 559
	hcsr = mei_hcsr_read(dev) | H_IG;
	mei_hcsr_set(dev, hcsr);
560
	return 0;
O
Oren Weil 已提交
561 562
}

563
/**
564
 * mei_me_pg_enter - write pg enter register
565 566 567 568 569 570
 *
 * @dev: the device structure
 */
static void mei_me_pg_enter(struct mei_device *dev)
{
	struct mei_me_hw *hw = to_me_hw(dev);
T
Tomas Winkler 已提交
571 572 573 574
	u32 reg;

	reg = mei_me_reg_read(hw, H_HPG_CSR);
	trace_mei_reg_read(dev->dev, "H_HPG_CSR", H_HPG_CSR, reg);
575

576
	reg |= H_HPG_CSR_PGI;
T
Tomas Winkler 已提交
577 578

	trace_mei_reg_write(dev->dev, "H_HPG_CSR", H_HPG_CSR, reg);
579 580 581 582
	mei_me_reg_write(hw, H_HPG_CSR, reg);
}

/**
583
 * mei_me_pg_exit - write pg exit register
584 585 586 587 588 589
 *
 * @dev: the device structure
 */
static void mei_me_pg_exit(struct mei_device *dev)
{
	struct mei_me_hw *hw = to_me_hw(dev);
T
Tomas Winkler 已提交
590 591 592 593
	u32 reg;

	reg = mei_me_reg_read(hw, H_HPG_CSR);
	trace_mei_reg_read(dev->dev, "H_HPG_CSR", H_HPG_CSR, reg);
594 595 596 597

	WARN(!(reg & H_HPG_CSR_PGI), "PGI is not set\n");

	reg |= H_HPG_CSR_PGIHEXR;
T
Tomas Winkler 已提交
598 599

	trace_mei_reg_write(dev->dev, "H_HPG_CSR", H_HPG_CSR, reg);
600 601 602
	mei_me_reg_write(hw, H_HPG_CSR, reg);
}

603 604 605 606 607
/**
 * mei_me_pg_set_sync - perform pg entry procedure
 *
 * @dev: the device structure
 *
608
 * Return: 0 on success an error code otherwise
609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644
 */
int mei_me_pg_set_sync(struct mei_device *dev)
{
	struct mei_me_hw *hw = to_me_hw(dev);
	unsigned long timeout = mei_secs_to_jiffies(MEI_PGI_TIMEOUT);
	int ret;

	dev->pg_event = MEI_PG_EVENT_WAIT;

	ret = mei_hbm_pg(dev, MEI_PG_ISOLATION_ENTRY_REQ_CMD);
	if (ret)
		return ret;

	mutex_unlock(&dev->device_lock);
	wait_event_timeout(dev->wait_pg,
		dev->pg_event == MEI_PG_EVENT_RECEIVED, timeout);
	mutex_lock(&dev->device_lock);

	if (dev->pg_event == MEI_PG_EVENT_RECEIVED) {
		mei_me_pg_enter(dev);
		ret = 0;
	} else {
		ret = -ETIME;
	}

	dev->pg_event = MEI_PG_EVENT_IDLE;
	hw->pg_state = MEI_PG_ON;

	return ret;
}

/**
 * mei_me_pg_unset_sync - perform pg exit procedure
 *
 * @dev: the device structure
 *
645
 * Return: 0 on success an error code otherwise
646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676
 */
int mei_me_pg_unset_sync(struct mei_device *dev)
{
	struct mei_me_hw *hw = to_me_hw(dev);
	unsigned long timeout = mei_secs_to_jiffies(MEI_PGI_TIMEOUT);
	int ret;

	if (dev->pg_event == MEI_PG_EVENT_RECEIVED)
		goto reply;

	dev->pg_event = MEI_PG_EVENT_WAIT;

	mei_me_pg_exit(dev);

	mutex_unlock(&dev->device_lock);
	wait_event_timeout(dev->wait_pg,
		dev->pg_event == MEI_PG_EVENT_RECEIVED, timeout);
	mutex_lock(&dev->device_lock);

reply:
	if (dev->pg_event == MEI_PG_EVENT_RECEIVED)
		ret = mei_hbm_pg(dev, MEI_PG_ISOLATION_EXIT_RES_CMD);
	else
		ret = -ETIME;

	dev->pg_event = MEI_PG_EVENT_IDLE;
	hw->pg_state = MEI_PG_OFF;

	return ret;
}

677 678 679 680 681
/**
 * mei_me_pg_is_enabled - detect if PG is supported by HW
 *
 * @dev: the device structure
 *
682
 * Return: true is pg supported, false otherwise
683 684 685
 */
static bool mei_me_pg_is_enabled(struct mei_device *dev)
{
686
	u32 reg = mei_me_mecsr_read(dev);
687 688 689 690

	if ((reg & ME_PGIC_HRA) == 0)
		goto notsupported;

691
	if (!dev->hbm_f_pg_supported)
692 693 694 695 696
		goto notsupported;

	return true;

notsupported:
697
	dev_dbg(dev->dev, "pg: not supported: HGP = %d hbm version %d.%d ?= %d.%d\n",
698 699 700 701 702 703 704 705 706
		!!(reg & ME_PGIC_HRA),
		dev->version.major_version,
		dev->version.minor_version,
		HBM_MAJOR_VERSION_PGI,
		HBM_MINOR_VERSION_PGI);

	return false;
}

707 708 709 710 711 712
/**
 * mei_me_irq_quick_handler - The ISR of the MEI device
 *
 * @irq: The irq number
 * @dev_id: pointer to the device structure
 *
713
 * Return: irqreturn_t
714 715 716 717 718
 */

irqreturn_t mei_me_irq_quick_handler(int irq, void *dev_id)
{
	struct mei_device *dev = (struct mei_device *) dev_id;
719
	u32 hcsr = mei_hcsr_read(dev);
720

721
	if ((hcsr & H_IS) != H_IS)
722 723 724
		return IRQ_NONE;

	/* clear H_IS bit in H_CSR */
725
	mei_hcsr_write(dev, hcsr);
726 727 728 729 730 731 732 733 734 735 736

	return IRQ_WAKE_THREAD;
}

/**
 * mei_me_irq_thread_handler - function called after ISR to handle the interrupt
 * processing.
 *
 * @irq: The irq number
 * @dev_id: pointer to the device structure
 *
737
 * Return: irqreturn_t
738 739 740 741 742 743 744
 *
 */
irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id)
{
	struct mei_device *dev = (struct mei_device *) dev_id;
	struct mei_cl_cb complete_list;
	s32 slots;
745
	int rets = 0;
746

747
	dev_dbg(dev->dev, "function called after ISR to handle the interrupt processing.\n");
748 749 750 751 752 753
	/* initialize our complete list */
	mutex_lock(&dev->device_lock);
	mei_io_list_init(&complete_list);

	/* Ack the interrupt here
	 * In case of MSI we don't go through the quick handler */
754
	if (pci_dev_msi_enabled(to_pci_dev(dev->dev)))
755 756 757
		mei_clear_interrupts(dev);

	/* check if ME wants a reset */
758
	if (!mei_hw_is_ready(dev) && dev->dev_state != MEI_DEV_RESETTING) {
759
		dev_warn(dev->dev, "FW not ready: resetting.\n");
760 761
		schedule_work(&dev->reset_work);
		goto end;
762 763 764 765 766
	}

	/*  check if we need to start the dev */
	if (!mei_host_is_ready(dev)) {
		if (mei_hw_is_ready(dev)) {
767
			dev_dbg(dev->dev, "we need to start the dev.\n");
T
Tomas Winkler 已提交
768
			dev->recvd_hw_ready = true;
769
			wake_up(&dev->wait_hw_ready);
770
		} else {
771
			dev_dbg(dev->dev, "Spurious Interrupt\n");
772
		}
773
		goto end;
774 775 776 777
	}
	/* check slots available for reading */
	slots = mei_count_full_read_slots(dev);
	while (slots > 0) {
778
		dev_dbg(dev->dev, "slots to read = %08x\n", slots);
779
		rets = mei_irq_read_handler(dev, &complete_list, &slots);
780 781 782 783 784 785 786
		/* There is a race between ME write and interrupt delivery:
		 * Not all data is always available immediately after the
		 * interrupt, so try to read again on the next interrupt.
		 */
		if (rets == -ENODATA)
			break;

787
		if (rets && dev->dev_state != MEI_DEV_RESETTING) {
788
			dev_err(dev->dev, "mei_irq_read_handler ret = %d.\n",
789
						rets);
790
			schedule_work(&dev->reset_work);
791
			goto end;
792
		}
793
	}
794

795 796
	dev->hbuf_is_ready = mei_hbuf_is_ready(dev);

797 798 799 800 801 802 803 804 805
	/*
	 * During PG handshake only allowed write is the replay to the
	 * PG exit message, so block calling write function
	 * if the pg state is not idle
	 */
	if (dev->pg_event == MEI_PG_EVENT_IDLE) {
		rets = mei_irq_write_handler(dev, &complete_list);
		dev->hbuf_is_ready = mei_hbuf_is_ready(dev);
	}
806

807
	mei_irq_compl_handler(dev, &complete_list);
808

809
end:
810
	dev_dbg(dev->dev, "interrupt thread end ret = %d\n", rets);
811
	mutex_unlock(&dev->device_lock);
812 813
	return IRQ_HANDLED;
}
814

815 816
static const struct mei_hw_ops mei_me_hw_ops = {

817
	.fw_status = mei_me_fw_status,
818 819
	.pg_state  = mei_me_pg_state,

820 821 822 823
	.host_is_ready = mei_me_host_is_ready,

	.hw_is_ready = mei_me_hw_is_ready,
	.hw_reset = mei_me_hw_reset,
T
Tomas Winkler 已提交
824 825
	.hw_config = mei_me_hw_config,
	.hw_start = mei_me_hw_start,
826

827 828
	.pg_is_enabled = mei_me_pg_is_enabled,

829 830 831 832 833 834 835 836 837 838 839 840 841 842 843
	.intr_clear = mei_me_intr_clear,
	.intr_enable = mei_me_intr_enable,
	.intr_disable = mei_me_intr_disable,

	.hbuf_free_slots = mei_me_hbuf_empty_slots,
	.hbuf_is_ready = mei_me_hbuf_is_empty,
	.hbuf_max_len = mei_me_hbuf_max_len,

	.write = mei_me_write_message,

	.rdbuf_full_slots = mei_me_count_full_read_slots,
	.read_hdr = mei_me_mecbrw_read,
	.read = mei_me_read_slots
};

844 845 846
static bool mei_me_fw_type_nm(struct pci_dev *pdev)
{
	u32 reg;
847

848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868
	pci_read_config_dword(pdev, PCI_CFG_HFS_2, &reg);
	/* make sure that bit 9 (NM) is up and bit 10 (DM) is down */
	return (reg & 0x600) == 0x200;
}

#define MEI_CFG_FW_NM                           \
	.quirk_probe = mei_me_fw_type_nm

static bool mei_me_fw_type_sps(struct pci_dev *pdev)
{
	u32 reg;
	/* Read ME FW Status check for SPS Firmware */
	pci_read_config_dword(pdev, PCI_CFG_HFS_1, &reg);
	/* if bits [19:16] = 15, running SPS Firmware */
	return (reg & 0xf0000) == 0xf0000;
}

#define MEI_CFG_FW_SPS                           \
	.quirk_probe = mei_me_fw_type_sps


869 870 871 872 873 874 875 876 877 878 879 880
#define MEI_CFG_LEGACY_HFS                      \
	.fw_status.count = 0

#define MEI_CFG_ICH_HFS                        \
	.fw_status.count = 1,                   \
	.fw_status.status[0] = PCI_CFG_HFS_1

#define MEI_CFG_PCH_HFS                         \
	.fw_status.count = 2,                   \
	.fw_status.status[0] = PCI_CFG_HFS_1,   \
	.fw_status.status[1] = PCI_CFG_HFS_2

881 882 883 884 885 886 887 888
#define MEI_CFG_PCH8_HFS                        \
	.fw_status.count = 6,                   \
	.fw_status.status[0] = PCI_CFG_HFS_1,   \
	.fw_status.status[1] = PCI_CFG_HFS_2,   \
	.fw_status.status[2] = PCI_CFG_HFS_3,   \
	.fw_status.status[3] = PCI_CFG_HFS_4,   \
	.fw_status.status[4] = PCI_CFG_HFS_5,   \
	.fw_status.status[5] = PCI_CFG_HFS_6
889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904

/* ICH Legacy devices */
const struct mei_cfg mei_me_legacy_cfg = {
	MEI_CFG_LEGACY_HFS,
};

/* ICH devices */
const struct mei_cfg mei_me_ich_cfg = {
	MEI_CFG_ICH_HFS,
};

/* PCH devices */
const struct mei_cfg mei_me_pch_cfg = {
	MEI_CFG_PCH_HFS,
};

905 906 907 908 909 910 911

/* PCH Cougar Point and Patsburg with quirk for Node Manager exclusion */
const struct mei_cfg mei_me_pch_cpt_pbg_cfg = {
	MEI_CFG_PCH_HFS,
	MEI_CFG_FW_NM,
};

912 913 914 915 916 917 918 919
/* PCH8 Lynx Point and newer devices */
const struct mei_cfg mei_me_pch8_cfg = {
	MEI_CFG_PCH8_HFS,
};

/* PCH8 Lynx Point with quirk for SPS Firmware exclusion */
const struct mei_cfg mei_me_pch8_sps_cfg = {
	MEI_CFG_PCH8_HFS,
920 921 922
	MEI_CFG_FW_SPS,
};

923
/**
924
 * mei_me_dev_init - allocates and initializes the mei device structure
925 926
 *
 * @pdev: The pci device structure
927
 * @cfg: per device generation config
928
 *
929
 * Return: The mei_device_device pointer on success, NULL on failure.
930
 */
931 932
struct mei_device *mei_me_dev_init(struct pci_dev *pdev,
				   const struct mei_cfg *cfg)
933 934
{
	struct mei_device *dev;
935
	struct mei_me_hw *hw;
936 937 938 939 940

	dev = kzalloc(sizeof(struct mei_device) +
			 sizeof(struct mei_me_hw), GFP_KERNEL);
	if (!dev)
		return NULL;
941
	hw = to_me_hw(dev);
942

943
	mei_device_init(dev, &pdev->dev, &mei_me_hw_ops);
944
	hw->cfg = cfg;
945 946
	return dev;
}
947