mei: extract supported features from the hbm version
[firefly-linux-kernel-4.4.55.git] / drivers / misc / mei / hw-me.c
1 /*
2  *
3  * Intel Management Engine Interface (Intel MEI) Linux driver
4  * Copyright (c) 2003-2012, Intel Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  */
16
17 #include <linux/pci.h>
18
19 #include <linux/kthread.h>
20 #include <linux/interrupt.h>
21
22 #include "mei_dev.h"
23 #include "hbm.h"
24
25 #include "hw-me.h"
26 #include "hw-me-regs.h"
27
28 /**
29  * mei_me_reg_read - Reads 32bit data from the mei device
30  *
31  * @dev: the device structure
32  * @offset: offset from which to read the data
33  *
34  * returns register value (u32)
35  */
36 static inline u32 mei_me_reg_read(const struct mei_me_hw *hw,
37                                unsigned long offset)
38 {
39         return ioread32(hw->mem_addr + offset);
40 }
41
42
43 /**
44  * mei_me_reg_write - Writes 32bit data to the mei device
45  *
46  * @dev: the device structure
47  * @offset: offset from which to write the data
48  * @value: register value to write (u32)
49  */
50 static inline void mei_me_reg_write(const struct mei_me_hw *hw,
51                                  unsigned long offset, u32 value)
52 {
53         iowrite32(value, hw->mem_addr + offset);
54 }
55
56 /**
57  * mei_me_mecbrw_read - Reads 32bit data from ME circular buffer
58  *  read window register
59  *
60  * @dev: the device structure
61  *
62  * returns ME_CB_RW register value (u32)
63  */
64 static u32 mei_me_mecbrw_read(const struct mei_device *dev)
65 {
66         return mei_me_reg_read(to_me_hw(dev), ME_CB_RW);
67 }
68 /**
69  * mei_me_mecsr_read - Reads 32bit data from the ME CSR
70  *
71  * @dev: the device structure
72  *
73  * returns ME_CSR_HA register value (u32)
74  */
75 static inline u32 mei_me_mecsr_read(const struct mei_me_hw *hw)
76 {
77         return mei_me_reg_read(hw, ME_CSR_HA);
78 }
79
80 /**
81  * mei_hcsr_read - Reads 32bit data from the host CSR
82  *
83  * @dev: the device structure
84  *
85  * returns H_CSR register value (u32)
86  */
87 static inline u32 mei_hcsr_read(const struct mei_me_hw *hw)
88 {
89         return mei_me_reg_read(hw, H_CSR);
90 }
91
92 /**
93  * mei_hcsr_set - writes H_CSR register to the mei device,
94  * and ignores the H_IS bit for it is write-one-to-zero.
95  *
96  * @dev: the device structure
97  */
98 static inline void mei_hcsr_set(struct mei_me_hw *hw, u32 hcsr)
99 {
100         hcsr &= ~H_IS;
101         mei_me_reg_write(hw, H_CSR, hcsr);
102 }
103
104
105 /**
106  * mei_me_hw_config - configure hw dependent settings
107  *
108  * @dev: mei device
109  */
110 static void mei_me_hw_config(struct mei_device *dev)
111 {
112         struct mei_me_hw *hw = to_me_hw(dev);
113         u32 hcsr = mei_hcsr_read(to_me_hw(dev));
114         /* Doesn't change in runtime */
115         dev->hbuf_depth = (hcsr & H_CBD) >> 24;
116
117         hw->pg_state = MEI_PG_OFF;
118 }
119
120 /**
121  * mei_me_pg_state  - translate internal pg state
122  *   to the mei power gating state
123  *
124  * @hw -  me hardware
125  * returns: MEI_PG_OFF if aliveness is on and MEI_PG_ON otherwise
126  */
127 static inline enum mei_pg_state mei_me_pg_state(struct mei_device *dev)
128 {
129         struct mei_me_hw *hw = to_me_hw(dev);
130         return hw->pg_state;
131 }
132
133 /**
134  * mei_clear_interrupts - clear and stop interrupts
135  *
136  * @dev: the device structure
137  */
138 static void mei_me_intr_clear(struct mei_device *dev)
139 {
140         struct mei_me_hw *hw = to_me_hw(dev);
141         u32 hcsr = mei_hcsr_read(hw);
142         if ((hcsr & H_IS) == H_IS)
143                 mei_me_reg_write(hw, H_CSR, hcsr);
144 }
145 /**
146  * mei_me_intr_enable - enables mei device interrupts
147  *
148  * @dev: the device structure
149  */
150 static void mei_me_intr_enable(struct mei_device *dev)
151 {
152         struct mei_me_hw *hw = to_me_hw(dev);
153         u32 hcsr = mei_hcsr_read(hw);
154         hcsr |= H_IE;
155         mei_hcsr_set(hw, hcsr);
156 }
157
158 /**
159  * mei_disable_interrupts - disables mei device interrupts
160  *
161  * @dev: the device structure
162  */
163 static void mei_me_intr_disable(struct mei_device *dev)
164 {
165         struct mei_me_hw *hw = to_me_hw(dev);
166         u32 hcsr = mei_hcsr_read(hw);
167         hcsr  &= ~H_IE;
168         mei_hcsr_set(hw, hcsr);
169 }
170
171 /**
172  * mei_me_hw_reset_release - release device from the reset
173  *
174  * @dev: the device structure
175  */
176 static void mei_me_hw_reset_release(struct mei_device *dev)
177 {
178         struct mei_me_hw *hw = to_me_hw(dev);
179         u32 hcsr = mei_hcsr_read(hw);
180
181         hcsr |= H_IG;
182         hcsr &= ~H_RST;
183         mei_hcsr_set(hw, hcsr);
184
185         /* complete this write before we set host ready on another CPU */
186         mmiowb();
187 }
188 /**
189  * mei_me_hw_reset - resets fw via mei csr register.
190  *
191  * @dev: the device structure
192  * @intr_enable: if interrupt should be enabled after reset.
193  */
194 static int mei_me_hw_reset(struct mei_device *dev, bool intr_enable)
195 {
196         struct mei_me_hw *hw = to_me_hw(dev);
197         u32 hcsr = mei_hcsr_read(hw);
198
199         hcsr |= H_RST | H_IG | H_IS;
200
201         if (intr_enable)
202                 hcsr |= H_IE;
203         else
204                 hcsr &= ~H_IE;
205
206         dev->recvd_hw_ready = false;
207         mei_me_reg_write(hw, H_CSR, hcsr);
208
209         /*
210          * Host reads the H_CSR once to ensure that the
211          * posted write to H_CSR completes.
212          */
213         hcsr = mei_hcsr_read(hw);
214
215         if ((hcsr & H_RST) == 0)
216                 dev_warn(&dev->pdev->dev, "H_RST is not set = 0x%08X", hcsr);
217
218         if ((hcsr & H_RDY) == H_RDY)
219                 dev_warn(&dev->pdev->dev, "H_RDY is not cleared 0x%08X", hcsr);
220
221         if (intr_enable == false)
222                 mei_me_hw_reset_release(dev);
223
224         return 0;
225 }
226
227 /**
228  * mei_me_host_set_ready - enable device
229  *
230  * @dev - mei device
231  * returns bool
232  */
233
234 static void mei_me_host_set_ready(struct mei_device *dev)
235 {
236         struct mei_me_hw *hw = to_me_hw(dev);
237         hw->host_hw_state = mei_hcsr_read(hw);
238         hw->host_hw_state |= H_IE | H_IG | H_RDY;
239         mei_hcsr_set(hw, hw->host_hw_state);
240 }
241 /**
242  * mei_me_host_is_ready - check whether the host has turned ready
243  *
244  * @dev - mei device
245  * returns bool
246  */
247 static bool mei_me_host_is_ready(struct mei_device *dev)
248 {
249         struct mei_me_hw *hw = to_me_hw(dev);
250         hw->host_hw_state = mei_hcsr_read(hw);
251         return (hw->host_hw_state & H_RDY) == H_RDY;
252 }
253
254 /**
255  * mei_me_hw_is_ready - check whether the me(hw) has turned ready
256  *
257  * @dev - mei device
258  * returns bool
259  */
260 static bool mei_me_hw_is_ready(struct mei_device *dev)
261 {
262         struct mei_me_hw *hw = to_me_hw(dev);
263         hw->me_hw_state = mei_me_mecsr_read(hw);
264         return (hw->me_hw_state & ME_RDY_HRA) == ME_RDY_HRA;
265 }
266
267 static int mei_me_hw_ready_wait(struct mei_device *dev)
268 {
269         mutex_unlock(&dev->device_lock);
270         wait_event_timeout(dev->wait_hw_ready,
271                         dev->recvd_hw_ready,
272                         mei_secs_to_jiffies(MEI_HW_READY_TIMEOUT));
273         mutex_lock(&dev->device_lock);
274         if (!dev->recvd_hw_ready) {
275                 dev_err(&dev->pdev->dev, "wait hw ready failed\n");
276                 return -ETIME;
277         }
278
279         dev->recvd_hw_ready = false;
280         return 0;
281 }
282
283 static int mei_me_hw_start(struct mei_device *dev)
284 {
285         int ret = mei_me_hw_ready_wait(dev);
286         if (ret)
287                 return ret;
288         dev_dbg(&dev->pdev->dev, "hw is ready\n");
289
290         mei_me_host_set_ready(dev);
291         return ret;
292 }
293
294
295 /**
296  * mei_hbuf_filled_slots - gets number of device filled buffer slots
297  *
298  * @dev: the device structure
299  *
300  * returns number of filled slots
301  */
302 static unsigned char mei_hbuf_filled_slots(struct mei_device *dev)
303 {
304         struct mei_me_hw *hw = to_me_hw(dev);
305         char read_ptr, write_ptr;
306
307         hw->host_hw_state = mei_hcsr_read(hw);
308
309         read_ptr = (char) ((hw->host_hw_state & H_CBRP) >> 8);
310         write_ptr = (char) ((hw->host_hw_state & H_CBWP) >> 16);
311
312         return (unsigned char) (write_ptr - read_ptr);
313 }
314
315 /**
316  * mei_me_hbuf_is_empty - checks if host buffer is empty.
317  *
318  * @dev: the device structure
319  *
320  * returns true if empty, false - otherwise.
321  */
322 static bool mei_me_hbuf_is_empty(struct mei_device *dev)
323 {
324         return mei_hbuf_filled_slots(dev) == 0;
325 }
326
327 /**
328  * mei_me_hbuf_empty_slots - counts write empty slots.
329  *
330  * @dev: the device structure
331  *
332  * returns -EOVERFLOW if overflow, otherwise empty slots count
333  */
334 static int mei_me_hbuf_empty_slots(struct mei_device *dev)
335 {
336         unsigned char filled_slots, empty_slots;
337
338         filled_slots = mei_hbuf_filled_slots(dev);
339         empty_slots = dev->hbuf_depth - filled_slots;
340
341         /* check for overflow */
342         if (filled_slots > dev->hbuf_depth)
343                 return -EOVERFLOW;
344
345         return empty_slots;
346 }
347
348 static size_t mei_me_hbuf_max_len(const struct mei_device *dev)
349 {
350         return dev->hbuf_depth * sizeof(u32) - sizeof(struct mei_msg_hdr);
351 }
352
353
354 /**
355  * mei_me_write_message - writes a message to mei device.
356  *
357  * @dev: the device structure
358  * @header: mei HECI header of message
359  * @buf: message payload will be written
360  *
361  * This function returns -EIO if write has failed
362  */
363 static int mei_me_write_message(struct mei_device *dev,
364                         struct mei_msg_hdr *header,
365                         unsigned char *buf)
366 {
367         struct mei_me_hw *hw = to_me_hw(dev);
368         unsigned long rem;
369         unsigned long length = header->length;
370         u32 *reg_buf = (u32 *)buf;
371         u32 hcsr;
372         u32 dw_cnt;
373         int i;
374         int empty_slots;
375
376         dev_dbg(&dev->pdev->dev, MEI_HDR_FMT, MEI_HDR_PRM(header));
377
378         empty_slots = mei_hbuf_empty_slots(dev);
379         dev_dbg(&dev->pdev->dev, "empty slots = %hu.\n", empty_slots);
380
381         dw_cnt = mei_data2slots(length);
382         if (empty_slots < 0 || dw_cnt > empty_slots)
383                 return -EMSGSIZE;
384
385         mei_me_reg_write(hw, H_CB_WW, *((u32 *) header));
386
387         for (i = 0; i < length / 4; i++)
388                 mei_me_reg_write(hw, H_CB_WW, reg_buf[i]);
389
390         rem = length & 0x3;
391         if (rem > 0) {
392                 u32 reg = 0;
393                 memcpy(&reg, &buf[length - rem], rem);
394                 mei_me_reg_write(hw, H_CB_WW, reg);
395         }
396
397         hcsr = mei_hcsr_read(hw) | H_IG;
398         mei_hcsr_set(hw, hcsr);
399         if (!mei_me_hw_is_ready(dev))
400                 return -EIO;
401
402         return 0;
403 }
404
405 /**
406  * mei_me_count_full_read_slots - counts read full slots.
407  *
408  * @dev: the device structure
409  *
410  * returns -EOVERFLOW if overflow, otherwise filled slots count
411  */
412 static int mei_me_count_full_read_slots(struct mei_device *dev)
413 {
414         struct mei_me_hw *hw = to_me_hw(dev);
415         char read_ptr, write_ptr;
416         unsigned char buffer_depth, filled_slots;
417
418         hw->me_hw_state = mei_me_mecsr_read(hw);
419         buffer_depth = (unsigned char)((hw->me_hw_state & ME_CBD_HRA) >> 24);
420         read_ptr = (char) ((hw->me_hw_state & ME_CBRP_HRA) >> 8);
421         write_ptr = (char) ((hw->me_hw_state & ME_CBWP_HRA) >> 16);
422         filled_slots = (unsigned char) (write_ptr - read_ptr);
423
424         /* check for overflow */
425         if (filled_slots > buffer_depth)
426                 return -EOVERFLOW;
427
428         dev_dbg(&dev->pdev->dev, "filled_slots =%08x\n", filled_slots);
429         return (int)filled_slots;
430 }
431
432 /**
433  * mei_me_read_slots - reads a message from mei device.
434  *
435  * @dev: the device structure
436  * @buffer: message buffer will be written
437  * @buffer_length: message size will be read
438  */
439 static int mei_me_read_slots(struct mei_device *dev, unsigned char *buffer,
440                     unsigned long buffer_length)
441 {
442         struct mei_me_hw *hw = to_me_hw(dev);
443         u32 *reg_buf = (u32 *)buffer;
444         u32 hcsr;
445
446         for (; buffer_length >= sizeof(u32); buffer_length -= sizeof(u32))
447                 *reg_buf++ = mei_me_mecbrw_read(dev);
448
449         if (buffer_length > 0) {
450                 u32 reg = mei_me_mecbrw_read(dev);
451                 memcpy(reg_buf, &reg, buffer_length);
452         }
453
454         hcsr = mei_hcsr_read(hw) | H_IG;
455         mei_hcsr_set(hw, hcsr);
456         return 0;
457 }
458
459 /**
460  * mei_me_pg_enter - write pg enter register to mei device.
461  *
462  * @dev: the device structure
463  */
464 static void mei_me_pg_enter(struct mei_device *dev)
465 {
466         struct mei_me_hw *hw = to_me_hw(dev);
467         u32 reg = mei_me_reg_read(hw, H_HPG_CSR);
468         reg |= H_HPG_CSR_PGI;
469         mei_me_reg_write(hw, H_HPG_CSR, reg);
470 }
471
472 /**
473  * mei_me_pg_enter - write pg enter register to mei device.
474  *
475  * @dev: the device structure
476  */
477 static void mei_me_pg_exit(struct mei_device *dev)
478 {
479         struct mei_me_hw *hw = to_me_hw(dev);
480         u32 reg = mei_me_reg_read(hw, H_HPG_CSR);
481
482         WARN(!(reg & H_HPG_CSR_PGI), "PGI is not set\n");
483
484         reg |= H_HPG_CSR_PGIHEXR;
485         mei_me_reg_write(hw, H_HPG_CSR, reg);
486 }
487
488 /**
489  * mei_me_pg_set_sync - perform pg entry procedure
490  *
491  * @dev: the device structure
492  *
493  * returns 0 on success an error code otherwise
494  */
495 int mei_me_pg_set_sync(struct mei_device *dev)
496 {
497         struct mei_me_hw *hw = to_me_hw(dev);
498         unsigned long timeout = mei_secs_to_jiffies(MEI_PGI_TIMEOUT);
499         int ret;
500
501         dev->pg_event = MEI_PG_EVENT_WAIT;
502
503         ret = mei_hbm_pg(dev, MEI_PG_ISOLATION_ENTRY_REQ_CMD);
504         if (ret)
505                 return ret;
506
507         mutex_unlock(&dev->device_lock);
508         wait_event_timeout(dev->wait_pg,
509                 dev->pg_event == MEI_PG_EVENT_RECEIVED, timeout);
510         mutex_lock(&dev->device_lock);
511
512         if (dev->pg_event == MEI_PG_EVENT_RECEIVED) {
513                 mei_me_pg_enter(dev);
514                 ret = 0;
515         } else {
516                 ret = -ETIME;
517         }
518
519         dev->pg_event = MEI_PG_EVENT_IDLE;
520         hw->pg_state = MEI_PG_ON;
521
522         return ret;
523 }
524
525 /**
526  * mei_me_pg_unset_sync - perform pg exit procedure
527  *
528  * @dev: the device structure
529  *
530  * returns 0 on success an error code otherwise
531  */
532 int mei_me_pg_unset_sync(struct mei_device *dev)
533 {
534         struct mei_me_hw *hw = to_me_hw(dev);
535         unsigned long timeout = mei_secs_to_jiffies(MEI_PGI_TIMEOUT);
536         int ret;
537
538         if (dev->pg_event == MEI_PG_EVENT_RECEIVED)
539                 goto reply;
540
541         dev->pg_event = MEI_PG_EVENT_WAIT;
542
543         mei_me_pg_exit(dev);
544
545         mutex_unlock(&dev->device_lock);
546         wait_event_timeout(dev->wait_pg,
547                 dev->pg_event == MEI_PG_EVENT_RECEIVED, timeout);
548         mutex_lock(&dev->device_lock);
549
550 reply:
551         if (dev->pg_event == MEI_PG_EVENT_RECEIVED)
552                 ret = mei_hbm_pg(dev, MEI_PG_ISOLATION_EXIT_RES_CMD);
553         else
554                 ret = -ETIME;
555
556         dev->pg_event = MEI_PG_EVENT_IDLE;
557         hw->pg_state = MEI_PG_OFF;
558
559         return ret;
560 }
561
562 /**
563  * mei_me_pg_is_enabled - detect if PG is supported by HW
564  *
565  * @dev: the device structure
566  *
567  * returns: true is pg supported, false otherwise
568  */
569 static bool mei_me_pg_is_enabled(struct mei_device *dev)
570 {
571         struct mei_me_hw *hw = to_me_hw(dev);
572         u32 reg = mei_me_reg_read(hw, ME_CSR_HA);
573
574         if ((reg & ME_PGIC_HRA) == 0)
575                 goto notsupported;
576
577         if (!dev->hbm_f_pg_supported)
578                 goto notsupported;
579
580         return true;
581
582 notsupported:
583         dev_dbg(&dev->pdev->dev, "pg: not supported: HGP = %d hbm version %d.%d ?= %d.%d\n",
584                 !!(reg & ME_PGIC_HRA),
585                 dev->version.major_version,
586                 dev->version.minor_version,
587                 HBM_MAJOR_VERSION_PGI,
588                 HBM_MINOR_VERSION_PGI);
589
590         return false;
591 }
592
593 /**
594  * mei_me_irq_quick_handler - The ISR of the MEI device
595  *
596  * @irq: The irq number
597  * @dev_id: pointer to the device structure
598  *
599  * returns irqreturn_t
600  */
601
602 irqreturn_t mei_me_irq_quick_handler(int irq, void *dev_id)
603 {
604         struct mei_device *dev = (struct mei_device *) dev_id;
605         struct mei_me_hw *hw = to_me_hw(dev);
606         u32 csr_reg = mei_hcsr_read(hw);
607
608         if ((csr_reg & H_IS) != H_IS)
609                 return IRQ_NONE;
610
611         /* clear H_IS bit in H_CSR */
612         mei_me_reg_write(hw, H_CSR, csr_reg);
613
614         return IRQ_WAKE_THREAD;
615 }
616
617 /**
618  * mei_me_irq_thread_handler - function called after ISR to handle the interrupt
619  * processing.
620  *
621  * @irq: The irq number
622  * @dev_id: pointer to the device structure
623  *
624  * returns irqreturn_t
625  *
626  */
627 irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id)
628 {
629         struct mei_device *dev = (struct mei_device *) dev_id;
630         struct mei_cl_cb complete_list;
631         s32 slots;
632         int rets = 0;
633
634         dev_dbg(&dev->pdev->dev, "function called after ISR to handle the interrupt processing.\n");
635         /* initialize our complete list */
636         mutex_lock(&dev->device_lock);
637         mei_io_list_init(&complete_list);
638
639         /* Ack the interrupt here
640          * In case of MSI we don't go through the quick handler */
641         if (pci_dev_msi_enabled(dev->pdev))
642                 mei_clear_interrupts(dev);
643
644         /* check if ME wants a reset */
645         if (!mei_hw_is_ready(dev) && dev->dev_state != MEI_DEV_RESETTING) {
646                 dev_warn(&dev->pdev->dev, "FW not ready: resetting.\n");
647                 schedule_work(&dev->reset_work);
648                 goto end;
649         }
650
651         /*  check if we need to start the dev */
652         if (!mei_host_is_ready(dev)) {
653                 if (mei_hw_is_ready(dev)) {
654                         mei_me_hw_reset_release(dev);
655                         dev_dbg(&dev->pdev->dev, "we need to start the dev.\n");
656
657                         dev->recvd_hw_ready = true;
658                         wake_up(&dev->wait_hw_ready);
659                 } else {
660                         dev_dbg(&dev->pdev->dev, "Spurious Interrupt\n");
661                 }
662                 goto end;
663         }
664         /* check slots available for reading */
665         slots = mei_count_full_read_slots(dev);
666         while (slots > 0) {
667                 dev_dbg(&dev->pdev->dev, "slots to read = %08x\n", slots);
668                 rets = mei_irq_read_handler(dev, &complete_list, &slots);
669                 /* There is a race between ME write and interrupt delivery:
670                  * Not all data is always available immediately after the
671                  * interrupt, so try to read again on the next interrupt.
672                  */
673                 if (rets == -ENODATA)
674                         break;
675
676                 if (rets && dev->dev_state != MEI_DEV_RESETTING) {
677                         dev_err(&dev->pdev->dev, "mei_irq_read_handler ret = %d.\n",
678                                                 rets);
679                         schedule_work(&dev->reset_work);
680                         goto end;
681                 }
682         }
683
684         dev->hbuf_is_ready = mei_hbuf_is_ready(dev);
685
686         /*
687          * During PG handshake only allowed write is the replay to the
688          * PG exit message, so block calling write function
689          * if the pg state is not idle
690          */
691         if (dev->pg_event == MEI_PG_EVENT_IDLE) {
692                 rets = mei_irq_write_handler(dev, &complete_list);
693                 dev->hbuf_is_ready = mei_hbuf_is_ready(dev);
694         }
695
696         mei_irq_compl_handler(dev, &complete_list);
697
698 end:
699         dev_dbg(&dev->pdev->dev, "interrupt thread end ret = %d\n", rets);
700         mutex_unlock(&dev->device_lock);
701         return IRQ_HANDLED;
702 }
703
704 static const struct mei_hw_ops mei_me_hw_ops = {
705
706         .pg_state  = mei_me_pg_state,
707
708         .host_is_ready = mei_me_host_is_ready,
709
710         .hw_is_ready = mei_me_hw_is_ready,
711         .hw_reset = mei_me_hw_reset,
712         .hw_config = mei_me_hw_config,
713         .hw_start = mei_me_hw_start,
714
715         .pg_is_enabled = mei_me_pg_is_enabled,
716
717         .intr_clear = mei_me_intr_clear,
718         .intr_enable = mei_me_intr_enable,
719         .intr_disable = mei_me_intr_disable,
720
721         .hbuf_free_slots = mei_me_hbuf_empty_slots,
722         .hbuf_is_ready = mei_me_hbuf_is_empty,
723         .hbuf_max_len = mei_me_hbuf_max_len,
724
725         .write = mei_me_write_message,
726
727         .rdbuf_full_slots = mei_me_count_full_read_slots,
728         .read_hdr = mei_me_mecbrw_read,
729         .read = mei_me_read_slots
730 };
731
732 static bool mei_me_fw_type_nm(struct pci_dev *pdev)
733 {
734         u32 reg;
735         pci_read_config_dword(pdev, PCI_CFG_HFS_2, &reg);
736         /* make sure that bit 9 (NM) is up and bit 10 (DM) is down */
737         return (reg & 0x600) == 0x200;
738 }
739
740 #define MEI_CFG_FW_NM                           \
741         .quirk_probe = mei_me_fw_type_nm
742
743 static bool mei_me_fw_type_sps(struct pci_dev *pdev)
744 {
745         u32 reg;
746         /* Read ME FW Status check for SPS Firmware */
747         pci_read_config_dword(pdev, PCI_CFG_HFS_1, &reg);
748         /* if bits [19:16] = 15, running SPS Firmware */
749         return (reg & 0xf0000) == 0xf0000;
750 }
751
752 #define MEI_CFG_FW_SPS                           \
753         .quirk_probe = mei_me_fw_type_sps
754
755
756 #define MEI_CFG_LEGACY_HFS                      \
757         .fw_status.count = 0
758
759 #define MEI_CFG_ICH_HFS                        \
760         .fw_status.count = 1,                   \
761         .fw_status.status[0] = PCI_CFG_HFS_1
762
763 #define MEI_CFG_PCH_HFS                         \
764         .fw_status.count = 2,                   \
765         .fw_status.status[0] = PCI_CFG_HFS_1,   \
766         .fw_status.status[1] = PCI_CFG_HFS_2
767
768
769 /* ICH Legacy devices */
770 const struct mei_cfg mei_me_legacy_cfg = {
771         MEI_CFG_LEGACY_HFS,
772 };
773
774 /* ICH devices */
775 const struct mei_cfg mei_me_ich_cfg = {
776         MEI_CFG_ICH_HFS,
777 };
778
779 /* PCH devices */
780 const struct mei_cfg mei_me_pch_cfg = {
781         MEI_CFG_PCH_HFS,
782 };
783
784
785 /* PCH Cougar Point and Patsburg with quirk for Node Manager exclusion */
786 const struct mei_cfg mei_me_pch_cpt_pbg_cfg = {
787         MEI_CFG_PCH_HFS,
788         MEI_CFG_FW_NM,
789 };
790
791 /* PCH Lynx Point with quirk for SPS Firmware exclusion */
792 const struct mei_cfg mei_me_lpt_cfg = {
793         MEI_CFG_PCH_HFS,
794         MEI_CFG_FW_SPS,
795 };
796
797 /**
798  * mei_me_dev_init - allocates and initializes the mei device structure
799  *
800  * @pdev: The pci device structure
801  * @cfg: per device generation config
802  *
803  * returns The mei_device_device pointer on success, NULL on failure.
804  */
805 struct mei_device *mei_me_dev_init(struct pci_dev *pdev,
806                                    const struct mei_cfg *cfg)
807 {
808         struct mei_device *dev;
809
810         dev = kzalloc(sizeof(struct mei_device) +
811                          sizeof(struct mei_me_hw), GFP_KERNEL);
812         if (!dev)
813                 return NULL;
814
815         mei_device_init(dev, cfg);
816
817         dev->ops = &mei_me_hw_ops;
818
819         dev->pdev = pdev;
820         return dev;
821 }
822